XPath

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

...muchas Gracias vorerst.

Code: Alles auswählen

MSGBOX XML_sGetContent("Datei1.xml","book[attribute::id='bk111']/price")
funktioniert jetzt anscheinend doch einwandfrei.
Auch wenn ich die Befehlszeile

Code: Alles auswählen

      vParam1 = "SelectionLanguage"
      vParam2 = "XPath"
      OBJECT CALL oDocument.setProperty(vParam1,vParam2)
wieder auskommentiere, funktioniert es. :allright:

Aber gleichzeitig bekomme ich jetzt bei einem anderen XML-Dokument einen Error 16:
Der Pfad "contents/text/entry/description" ist aber absolut korrekt. Auch wenn ich nur "contents/" eingebe kommt dieser Fehler. Heißt das, dass in dem XML-Dokument ein Fehler drin ist?

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Aber gleichzeitig bekomme ich jetzt bei einem anderen XML-Dokument
> einen Error 16:

gibt's dazu auch einen Text? Error 16 sagt mir jetzt nicht so viel ;-)

> Der Pfad "contents/text/entry/description" ist aber absolut korrekt. Auch
> wenn ich nur "contents/" eingebe kommt dieser Fehler.

Zeig mal Dein XML.

> Heißt das, dass in dem XML-Dokument ein Fehler drin ist?

nein. wenn das XML in das oDocument geladen worden ist, dann ist es
auch 'wellformed'. Sprich: Von der Struktur her ist es korrekt, weil es
bereits beim Laden validiert wird.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Code: Alles auswählen

<?xml version="1.0"?>
<InternesBeispiel>
     <properties>
         <name>TestXML</name>
         <creationDate>07.08.06</creationDate>
         <creator>MAG</creator>
         <titel>Tääst</titel>
         <customer>Privat</customer>
         <dimensions>
             <width>350</width>
             <height>200</height>
         </dimensions>
     </properties>
         
     <contents>
          <text>
               <entry id="1">
                    <description>Test Text</description>
                    <content>Hier kommt rein, was da so rumgeblubbert werden soll</content>
                    <coordinates>
                         <width>40</width>
                         <height>20</height>
                    </coordinates>
                    <factors>
                         <width>1</width>  
                         <height>1</height>
                         <font>1</font>
                         <rotation>0</rotation>
                         <reversing>0</reversing>
                    </factors>
               </entry>
       </contents>
</InternesBeispiel>
So und der Aufruf ist

Code: Alles auswählen

MSGBOX XML_sGetContent("F:\LabelManager\Datei3.xml","contents/text/entry[attribute::id='1']/description")
Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Code: Alles auswählen

 [...]
               </entry>
       </contents>
</InternesBeispiel>
da fehlt zwischen </entry> und </contents> noch das </text>-Tag.

XML_sGetContent() ist eine von Dir geschriebene Prozedur? Wenn ja, dann
solltest Du nach dem Laden des XML in das DomDocument auch den
ParseError-Errorcode abfragen.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Also ungefähr so..?

Code: Alles auswählen

   vFile = sFile
   OBJECT CALL oDocument.load(vFile) TO vRes
   
   OBJECT GET oDocument.parseError() TO vRes
   IF XML_GetLastErr(vRes) THEN
      EXIT FUNCTION
   END IF
Und hier die Routine (abgespeckt):

Code: Alles auswählen

FUNCTION XML_GetLastErr(sErrNode AS VARIANT) AS LONG
   LOCAL oErrDoc AS DISPATCH
   
   LOCAL sErrCode AS STRING
   LOCAL vRes AS VARIANT
   
   SET oErrDoc = sErrNode
   OBJECT GET oErrDoc.ErrCode TO vRes
   sErrCode = STR$(VARIANT#(vRes))
   MSGBOX sErrCode
   IF VAL(sErrCode) THEN
      FUNCTION = VAL(sErrCode)
   ELSE
      FUNCTION=0
   END IF
END FUNCTION
Gibt nichts zurück--- Aber das "Try-Catch" innerhalb des Ladevorganges liefert mir immer diesen Fehler N°16...

Gr33tz
Tafkadasom2k5 (der sich für deine Geduld erstmal bedankt..)

EDIT: Übrigends bekomme ich mit diese XML jetzt den Fehler N° 12...
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Tafkadasom2k5 hat geschrieben:Also ungefähr so..?
mh, weiss nicht. Ist für mich schwierig, diese Power Basic - Syntax zu
lesen. Sieht aber -- soweit ich das beurteilen kann -- ganz gut aus.

Generell würde ich so vorgehen:

* XML laden

* ErrorCode auf ungleich 0 abfragen

* Wenn ErrorCode ungleich 0, dann noch zusätzlich den Fehlertext
(get_reason()), den Quelltext (get_srcText()), die Zeile, in der der Fehler
auftrat (get_line()) und die Position innerhalb der fehlerhaften Zeile
(get_linepos()) mit ausgeben. Somit hast Du eine aussagekräftige
Fehlermeldung.

> Gibt nichts zurück--- Aber das "Try-Catch" innerhalb des Ladevorganges
> liefert mir immer diesen Fehler N°16...

auch nachdem Du das fehlerhafte XML korrigiert hast?

Kleiner Tipp: Wenn Du ein XML zusammenbastelst (hast Du wahrscheinlich
mit einem Texteditor gemacht?), solltest Du das XML mal kurz in Deinen
IE oder (falls vorhanden) in den FireFox droppen. Dort wird Dir dann sofort
angezeigt, wenn das XML nicht 'wellformed' ist.

Grüße ... Kiffi

P.S.: Gibt's eigentlich einen Grund, warum Du das in Power Basic machst?
a²+b²=mc²
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Wie ich bereits sagte: Ich bin gerade in der Firma, und da wird damit gearbeitet.

Firefox spuckt mir diese XML einwandfrei aus.

Und die Fehlerbehandlung kommt garnicht zum EInsatz. Aber das Try/Catch greift trotzdem. Mit dem Fehler 12.
Wenn der "letzte Fehler" ausgespuckt würde, dann würde ich

Code: Alles auswählen

      sErrBuff = "Der Fehler " + sErrCode + " ist beim Parsen des Dokumentes '" + sURL + "' aufgetreten:" + $CRLF +_
                 "Er trat auf in " + sLine + " auf Position " + sLinePos + "." + $CRLF + _
                 "Grund: " + $CRLF + $CRLF + sReason
dabei herausbekommen (die Variablen uwrden im Zuge der Funktion bereits gefüllt mit den Rückgabewerten, die du gerade ansprachst...).

...also scheint soweit alles korrekt zu sein- was zum Kuckuck ist nur ERROR12?!

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Firefox spuckt mir diese XML einwandfrei aus.
> [...]
> Aber das Try/Catch greift trotzdem. Mit dem Fehler 12.

na, dann wäre es jetzt interessant herauszufinden, welches Objekt den Fehler
wirft. Wenn ein XML wellformed ist, wird es auch in der Regel problemlos vom
DomDocument geladen.

Wäre eine Zugriffsverletzung mangels fehlender Userrechte denkbar?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Leider nicht...

Code: Alles auswählen

            MSGBOX XML_sGetContent("C:\XMLTEST\Datei3.xml","contents/text/entry[attribute::id='1']/description")
            MSGBOX XML_sGetContent("C:\XMLTEST\Datei1.xml","books/book[attribute::id='bk111']/price")
Das 1te läuft nicht (Fehler 12, MSGBOX=""), das 2te umso mehr...(MSGBOX = "36.95")...

Gr33tz
Tafkadasom2k5

Edit: Der Fehler wird allem Anschein nach von dieser Zeile geworfen:

Code: Alles auswählen

      vSearch = sXML_Path
      OBJECT GET oDocument.documentElement.selectNodes(vSearch) TO vRes'<--hier!
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Das 1te läuft nicht (Fehler 12, MSGBOX="")

das liegt daran, dass Dein XPath-Abfrage kein Objekt zurückliefert. Du
solltest darauf achten, dass das in XML_sGetContent() durch einen
entsprechenden ErrorHandler abgefangen wird.

Das hier ist der korrekte XPath:

Code: Alles auswählen

MSGBOX XML_sGetContent("C:\XMLTEST\Datei3.xml","InternesBeispiel/contents/text/entry[attribute::id='1']/description")
Grüße ... Kiffi
a²+b²=mc²
Antworten