Frage

Ich möchte JDOM verwenden, um in einer XML -Datei zu lesen und dann mit XPath Daten aus dem JDOM -Dokument zu extrahieren. Es erstellt das Dokumentobjekt in Ordnung, aber wenn ich mit XPath das Dokument für eine Liste von Elementen abfragt, bekomme ich nichts.

Mein XML -Dokument hat im Stammelement einen Standard -Namespace definiert. Das Lustige ist, wenn ich den Standard -Namespace entferne, wird die XPath -Abfrage erfolgreich ausgeführt und die gewünschten Elemente zurückgegeben. Was muss ich sonst noch tun, um meine XPath -Abfrage dazu zu bringen, Ergebnisse zurückzugeben?

Xml:

<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.foo.com">
<dvd id="A">
  <title>Lord of the Rings: The Fellowship of the Ring</title>
  <length>178</length>
  <actor>Ian Holm</actor>
  <actor>Elijah Wood</actor>
  <actor>Ian McKellen</actor>
</dvd>
<dvd id="B">
  <title>The Matrix</title>
  <length>136</length>
  <actor>Keanu Reeves</actor>
  <actor>Laurence Fishburne</actor>
</dvd>
</collection>

Java:

public static void main(String args[]) throws Exception {
    SAXBuilder builder = new SAXBuilder();
    Document d = builder.build("xpath.xml");
    XPath xpath = XPath.newInstance("collection/dvd");
    xpath.addNamespace(d.getRootElement().getNamespace());
    System.out.println(xpath.selectNodes(d));
}
War es hilfreich?

Lösung

XPath 1.0 unterstützt das Konzept eines Standard -Namespace nicht (XPath 2.0 tut). Es wird immer angenommen, dass jedes nichtfixierte Tag Teil des No-Name-Namespace ist.

Beim Benutzen XPath 1.0 Du brauchst so etwas:

public static void main(String args[]) throws Exception {
    SAXBuilder builder = new SAXBuilder();
    Document d = builder.build("xpath.xml");
    XPath xpath = XPath.newInstance("x:collection/x:dvd");
    xpath.addNamespace("x", d.getRootElement().getNamespaceURI());
    System.out.println(xpath.selectNodes(d));
}

Andere Tipps

Ich hatte ein ähnliches Problem, aber meine war, dass ich eine Mischung aus XML -Eingaben hatte, von denen einige einen Namespace definiert hatten und andere, die es nicht taten. Um mein Problem zu vereinfachen, habe ich nach dem Laden des Dokuments das folgende Jdom -Snippet ausgeführt.

for (Element el : doc.getRootElement().getDescendants(new ElementFilter())) {
    if (el.getNamespace() != null) el.setNamespace(null);
}

Nachdem ich alle Namespaces entfernt hatte, konnte ich einfach verwenden GetChild ("Elname") Stilnavigation oder einfache XPath -Abfragen.

Ich würde diese Technik nicht als allgemeine Lösung empfehlen, aber in meinem Fall war sie definitiv nützlich.

Sie können auch Folgendes tun

/*[local-name() = 'collection']/*[local-name() = 'dvd']/

Hier ist Liste nützlicher XPath -Abfragen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top