XML * XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC * ANT * DIVERSES



XPath / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: parse-xml, parse-xml-fragment

XPath: parse-xml, parse-xml-fragment

XPath: parse-xml, parse-xml-fragment

parse-xml und parse-xml-fragment bieten hervorragende Möglichkeiten zur Konvertierung von Zeichenketten in XML-Dokumente. Bei parse-xml-fragment brauchen diese Zeichenketten auch nicht XML-wohlgeformt zu sein.

Auf dieser Seite:

Siehe auch , , sowie .

parse-xml

parse-xml liest ein XML-Dokument aus, das als Zeichenkette vorliegt, und gibt den Dokumentknoten zurück. Ist die übergebene Zeichenkette (args) leer, so gibt parse-xml eine leere Sequenz zurück. Stellt die übergebene Zeichenkette jedoch ein nicht wohlgeformtes XML-Dokument dar (z.B. die Zeichenkette enthält nicht exakt einen Rootnode), so wird eine Fehlermeldung generiert.

Signatur:


parse-xml($arg as xs:string?) as document-node(element(*))?

Beispiel:


let $input as xs:string := "<persons>
    <person>Berta Brotlos</person>
    <person>Hugo Holzflos</person>
    <person>Theo Trugschlos</person>
    <person>Ede Einschlos</person>
  </persons>"
return parse-xml($input) 

parse-xml-fragment

parse-xml-fragment liest eine Zeichenkette aus, die sich als Node-Sequenz interpretieren lässt, und gibt den Dokumentknoten zurück. Die Einzelwerte werden dabei zu Childnodes des Dokumentknotens. Ist die übergebene Zeichenkette (args) leer, so gibt parse-xml eine leere Sequenz zurück. Stellt die übergebene Zeichenkette jedoch ein nicht wohlgeformtes XML-Dokument dar, so wird eine Fehlermeldung generiert. Signatur:


parse-xml-fragment($arg as xs:string?) as document-node()?

Beispiel: Nehmen Sie an, Sie haben eine Textdatei, die im Sinn von XML nicht wohlgeformt ist, in der jedoch XML-Bäume enthalten sind.


let $input as xs:string := "'Moin', 1989, 45,
<persons>
<person>Berta Brotlos</person>
<person>Hugo Holzflos</person>
<person>Theo Trugschlos</person>
<person>Ede Einschlos</person>
</persons>, 
2020,
<Leute>
<Mensch>Lotte Rielos</Mensch>
<Mensch>Konrad Kraftlos</Mensch>
</Leute>,
171,
190,'dateiende'"
return parse-xml-fragment($input) 

Wenn Sie diese Textdatei als $input verwenden, so würden Sie mit parse-xml einen Fehler erhalten; parse-xml-fragment dagegen gibt Ihnen eine Sequenz der Items zurück.


for $w in parse-xml-fragment($input) return $w

Alternativ:


return parse-xml-fragment($input) 

Gezielte Auswertung mit unparsed-text und tokenize

Um die beiden XML-Bäume <person> und <Leute> auszuwerten und diese in <Person> zu konvertieren, können Sie mit , sowie parse-xml-fragment (evtl. ebenso möglich mit parse-xml), hier aufgerufen in XQuery, schnelle Erfolge erzielen:


let $datei := unparsed-text('C:/mixedcontent_testdat.txt')
let $personen := for $w in (tokenize($datei, ',')) 
                 where contains($w, '<') 
                 return parse-xml($w)
for $b at $p in $personen/root()/child::*/child::* 
                 return <Person>{$b/text()}</Person>

Das Ergebnis lautet dann:


<Person>Berta Brotlos</Person>
<Person>Hugo Holozflos</Person>
<Person>Theo Trugschlos</Person>
<Person>Ede Einschlos</Person>
<Person>Lotte Rielos</Person>
<Person>Konrad Kraftlos</Person>

wg / 12. Januar 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/parse_x_m_l.html