XHTML mit XPath parsen
Lore
- xml
0 Tim Tepaße
Hallo
Ich möchte ein XHTML-Dokument mit XPath parsen.
Folgende Ausdrücke habe ich an dem XHTML-Dokument (siehe unten) ausprobiert - alle ohne Erfolg:
/html
/html/@xmlns
//p
/html/body/div/p[@id='USA']
Hat jemand eine Ahnung, wieso das nicht funktioniert?
Vielen Dank
und viele Grüsse
Lore
(P.S.: Eigentlich möchte ich gern alle Absätze (<p>) herausfiltern.)
XTHML-Dokument: ***************************************************
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head></head>
<body>
<div>
<p id="USA">
Empire Burlesque<br/>
Bob Dylan<br/>
10.90
</p>
<p id="UK">
Hide your heart<br/>
Bonnie Tyler<br/>
10.0
</p>
<p id="USA">
Greatest Hits<br/>
Dolly Parton<br/>
9.90
</p>
</div>
</body>
</html>
Hallo,
Folgende Ausdrücke habe ich an dem XHTML-Dokument (siehe unten) ausprobiert - alle ohne Erfolg:
Ähm, wie hast Du das ausprobiert? DOM 3 XPath? Der XML Parser Deines Vertrauens mit XPath-Unterstützung? Im Browser? Welchem? Parst er das Dokument als HTML Tag Soup (weil MIME Media Typ text/html) oder als XML (weil MIME Media Typ application/xhtml+xml)? Sonst kann man eher nicht mehr sagen.
<p id="USA"> … </p>
<p id="UK"> … </p>
<p id="USA"> … </p>
Dein XHTML-Dokument ist übrigens kein valides XML, würde es als XML geparst. Ein Attribut vom Typ ID muss im Dokument einzigartig sein. Zwei IDs namens "USA" zu vergeben macht das Dokument also invalid.
Tim
Hallo Tim
Ich habe die Ausdrücke und die Page mit diesem online Tool getestet:
http://www.futurelab.ch/xmlkurs/xpath.de.html
Eigentlich will ich das ganze aber in einer .net Umgebung laufen lassen mit den Klassen XPathDocument und XPathNavigator. Damit hat's aber auch nicht funktioniert.
Die doppelte id habe ich inzwischen auf id='GB' umgesetzt. Spielte aber keine Rolle für den Erfolg.
Danke und Grüsse
Lore
Hallo,
Ich habe die Ausdrücke und die Page mit diesem online Tool getestet:
http://www.futurelab.ch/xmlkurs/xpath.de.html
/html
/html/@xmlns
//p
/html/body/div/p[@id='USA']
Wenn gar nicht anderes geht:
/*[local-name() = 'html']
/*[local-name() = 'html']/@xmlns
//*[local-name() = 'p']
/*[local-name() = 'html']/*[local-name() = 'body']/*[local-name() = 'div']/*[local-name() = 'p'][@id='USA']
Grüße
Thomas
Mmh. Kann man denn mit XPath überhaupt XHTML-Dokumente parsen?
Ich habe nämlich festgestellt, dass das Parsing funktioniert, wenn ich Doctype sowie den Namespace weglasse (leider brauche ich beide in meinen Dokumenten):
XPath-parsebares "XHTML"-Dokument: ***************************
<?xml version="1.0" encoding="ISO-8859-1"?>
<html>
<head></head>
<body>
<div>
<p id="USA">
Empire Burlesque<br/>
Bob Dylan<br/>
10.90
</p>
<p id="UK">
Hide your heart<br/>
Bonnie Tyler<br/>
10.0
</p>
<p id="GB">
Greatest Hits<br/>
Dolly Parton<br/>
9.90
</p>
</div>
</body>
</html>
Hallo Lore,
Mmh. Kann man denn mit XPath überhaupt XHTML-Dokumente parsen?
Ja, kann man.
Ich habe nämlich festgestellt, dass das Parsing funktioniert, wenn ich Doctype sowie den Namespace weglasse
Der Doctype hat damit nichts zu tun, die Namespaces aber schon.
Für den XPath-Ausdruck müssen ebenfalls Namespaces deklariert werden, wobei nicht die selben Prefixes verwendet werden müssen, wie im Dokument. (Das wäre auch nicht sinnvoll, schließlich kannst Du, wenn Du eine Anwendung schreibst, nicht wissen, welche Prefixe die Elemente haben, nur welche Namespaces).
Wenn Dein XPath-Ausdruck in ein XSLT-, XQuery- o.ä. Dokument eingebettet ist, kannst Du die Namespaces natürlich einfach im Dokument deklarieren. Verwendest Du XPath aber direkt in einer Anwendung, musst Du das irgendwie über die entsprechende API machen.
Bei DOM 3 XPath geht das mit Hilfe des XPathNSResolver-Interfaces.
Wenn Du irgend eine API von .NET verwendest, die nicht diesens Standard implementiert, dann verlinke doch bitte die Dokumentation dazu.
Grüße
Daniel