XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XPath / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: parse-xml, parse-xml-fragment
![]() |
![]() |
➪ parse-xml und parse-xml-fragment bieten hervorragende Möglichkeiten zur Konvertierung von Zeichenketten in XML-Dokumenten. Bei parse-xml-fragment brauchen diese Zeichenketten auch nicht XML-wohlgeformt zu sein.
Auf dieser Seite:Siehe auch unparsed-text, unparsed-text-lines, serialize sowie CDATA.
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 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)
Um die beiden XML-Bäume <person> und <Leute> auszuwerten und diese in <Person> zu konvertieren, können Sie mit unparsed-text, tokenize 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 / 3. Juli 2021
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de