Seite 2 von 5

Verfasst: 21.08.2006 13:30
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

Verfasst: 21.08.2006 13:40
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

Verfasst: 21.08.2006 13:56
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

Verfasst: 21.08.2006 14:08
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

Verfasst: 21.08.2006 14:37
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...

Verfasst: 21.08.2006 15:16
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?

Verfasst: 21.08.2006 15:24
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

Verfasst: 21.08.2006 15:46
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

Verfasst: 21.08.2006 15:49
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!

Verfasst: 21.08.2006 16:14
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