AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi SelectSingleNode gibt nil, obwohl ich ein Node erwarte...
Thema durchsuchen
Ansicht
Themen-Optionen

SelectSingleNode gibt nil, obwohl ich ein Node erwarte...

Ein Thema von Aenogym · begonnen am 25. Okt 2007 · letzter Beitrag vom 26. Okt 2007
Antwort Antwort
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#1

SelectSingleNode gibt nil, obwohl ich ein Node erwarte...

  Alt 25. Okt 2007, 12:56
Huhu DPler

ich bin seit langem mal wieder hier und habe auch gleich ein Problemchen
Es geht um eine SVG, die ich aus einem Adobe-Mars-Archiv extrahiert habe (Adobe Mars ist eine Technologie, die PDF-Dokumente mit allem Drum und Dran in XML abbildet).
Jedenfalls lade ich die SVG mithilfe des MSXML6-Parsers und möchte nun auf einen bestimmten Knoten zugreifen. Jedoch bekomme ich alsResultat immer nil

Die SVG:
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<svg xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:pdf="http://ns.adobe.com/pdf/2006" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" stroke="none" width="595" height="841">
   <defs>
      <color-profile name="cs-0" xlink:href="/color/cs-0.icc" pdf:Count="3" pdf:type="RGB" pdf:wp="0.9505 1 1.089" pdf:bp="0 0 0" pdf:r="0.4124 0.2126 0.0193" pdf:g="0.3576 0.7152 0.1192" pdf:b="0.1805 0.0722 0.9505"/>
      <pdf:Separation Name="cs-1" Colorant="HKS 66" AlternateSpace="cs-0">
         <pdf:TintTransform>
            <pdf:SampledFunction Domain="0 1" Range="0 1 0 1 0 1" Size="255" BitsPerSample="8" Order="linear" Encode="0 254" Decode="0 1 0 1 0 1">
               <pdf:File Name="/res/func-0.f0"/>
            </pdf:SampledFunction>
         </pdf:TintTransform>
      </pdf:Separation>
      <font-face font-family="F0">
         <font-face-src>
            <font-face-name name="AGaramond-Regular"/>
            <font-face-uri xlink:href="/font/f-0._sfnt"/>
         </font-face-src>
      </font-face>
      <font-face font-family="F1">
         <font-face-src>
            <font-face-name name="AGaramond-Semibold"/>
            <font-face-uri xlink:href="/font/f-1._sfnt"/>
         </font-face-src>
      </font-face>
      <clipPath id="cl-1">
         <path d="M0,841h595V0H0z"/>
      </clipPath>
      <clipPath id="cl-2">
         <path d="M0.015,840.99h594.99V0H0.015z"/>
      </clipPath>
   </defs>
   <g transform="matrix(1 0 0 -1 0 841)">
      <g clip-path="url(#cl-1)">
         <g clip-path="url(#cl-2)">
            <path stroke="rgb(0,0,0) device-color(DeviceGray,0)" stroke-width="0.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" d="M56.12,797H538"/>
            <text transform="matrix(1 0 0 -1 0 801.5599)" font-size="9.5" font-family="F0" fill="rgb(0,0,0) device-color(DeviceGray,0)" fill-rule="evenodd">
               <tspan x="56.14 60.889 100.0794 104.7239 110.993 116.5401 121.7925 127.045 132.5921 140.0297 145.7582 152.8443 157.4888 162.1333 168.7444 176.4004 182.527 188.0741 191.2841 196.9413 204.0274 211.465 218.5605 224.1075 231.5451 489.5204 494.165 500.586 506.2233 508.5688 511.1841 515.9332 519.0387 523.7878 528.5369 533.2859">64STELLENAUSSCHREIBUNGEN SVBl 2/2001</tspan>
            </text>
         </g>
      </g>
   </g>
</svg>
Mein Delphi-Code:
Delphi-Quellcode:
var
    xmldoc: IXMLDOMDocument3;
    tempnode: IXMLDOMNode;
//.....
xmldoc := CoDOMDocument60.Create();
        xmldoc.setProperty('NewParser', true);
        xmldoc.async := false;
        xmldoc.load(extractfilepath(paramstr(0))+'working\pg.svg');
        if xmldoc.parseError.errorCode = 0 then
        begin
          tempnode := xmldoc.documentelement.selectSingleNode('//text');
        end;
Ich möchte schlicht und einfach das erste <text>-Element bekommen, das im Dokument vorkommt....
Habt ihr eine Idee, was ich falsch mache?

Danke schonmal,
aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2

Re: SelectSingleNode gibt nil, obwohl ich ein Node erwarte..

  Alt 25. Okt 2007, 13:17
Schau doch mal nach (parseErrors.ErrorCode o.ä.), ob das Dokument überhaupt korrekt geladen wurde. Ansonsten stelle mal sicher, dass die Datei auch im UTF-8 Format gespeichert wurde.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: SelectSingleNode gibt nil, obwohl ich ein Node erwarte..

  Alt 25. Okt 2007, 13:29
Zitat von sakura:
Schau doch mal nach (parseErrors.ErrorCode o.ä.), ob das Dokument überhaupt korrekt geladen wurde. Ansonsten stelle mal sicher, dass die Datei auch im UTF-8 Format gespeichert wurde.

......
ErrorCode ist 0. Mein Haltepunkt auf die Zeile mit SelectSingleNode wird ja aufgerufen. Im UTF-8-Format ist das Ganze auch, habs eben nochmal händisch mit Notepad als UTF-8 gespeichert...

Das ist kurios

aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: SelectSingleNode gibt nil, obwohl ich ein Node erwarte..

  Alt 25. Okt 2007, 13:31
Zitat von sakura:
Schau doch mal nach (parseErrors.ErrorCode o.ä.), ob das Dokument überhaupt korrekt geladen wurde.
Hier eine Hilfsfunktion, die sehr nützlich bei der Fehlerprüfung ist.
Es wird eine Exception mit hilfreicher Meldung ausgelöst, was in diesem Falle
ja auch völlig korrekt ist, da man ja nicht weiterparsen darf.
Delphi-Quellcode:
procedure CheckDocumentError(const document:IXMLDOMDocument);
var
   msg : string;
   err : IXMLDOMParseError;
begin
   err := document.parseError;
   if err.errorCode <> 0 then
   begin
      msg := err.reason + #13#10
            + Format('Zeile: %d, Position: %d, Text: "%s"',[err.line,err.linepos,err.srcText]);
      if err.url <> 'then
         msg:=msg+#13#10+'URL: '+err.url;
      //raise EXmlError.Create(msg); // wer mag, kann eine eigene Exception-Klasse definieren
      raise Exception.Create(msg);
   end;
end;
Andreas
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: SelectSingleNode gibt nil, obwohl ich ein Node erwarte..

  Alt 25. Okt 2007, 18:56
Hallo Steffen,

du hast NewParser konfiguriert, aber dein Dokument ist nicht kompatibel.

Versuche es so:

Delphi-Quellcode:
var
  xmldoc: IXMLDOMDocument;
  tempnode: IXMLDOMNode;
  fn: TFileName;
begin
  fn := ExtractFilePath(ParamStr(0)) + 'working\pg.svg';
  xmldoc := CoDOMDocument.Create();
  xmldoc.async := False;
  if xmldoc.load(fn) then
  begin
    tempnode := xmldoc.selectSingleNode('//text');
    if Assigned(tempNode)
      then ShowMessage(tempnode.xml)
      else ShowMessage('try again later');
  end else CheckDocumentError(xmldoc);
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: SelectSingleNode gibt nil, obwohl ich ein Node erwarte..

  Alt 26. Okt 2007, 08:20
Danke marabu!
Das Problem war zwar nicht NewParser (in meinem Code auf False setzen brachte keine Verbesserung).
Es lag jedoch viel mehr an der Deklaration von xmlDoc und dessen Erstellung! Ich habe IXMLDOMDocument3 und CoDOMDocument60.Create() verwendet. Marabus Variante ohne die Ziffern funktioniert.

Vielen Dank nochmal euch allen

aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz