Hallo Zusammen!
Ich habe ein Problem mit Namespaces und XPath in Java DOM und so langsam weiß ich nicht, was ich noch tun soll. Vielleicht kann hier ja jemand helfen.
Angaben vorweg: Ich nutze Java 1.4.2 mit Xalan 2.6.0
Also: Ich habe eine XML-Datei, die ich mit XSLT transformiere. Das Ganze sieht so aus:
Heraus kommt eine solche Struktur:
<Files>
<File name="datei1">
<Daten xmlns:xxx="yyy">... hier Daten und hier auch erst der Namespace ...</Daten>
</File>
...
</Files>
Bei mir funktionieren XPath-Abfragen ohne Probleme, auf dem Testrechner wo das ganze laufen soll, beschwert er sich bereits beim Abfragen von //File/@name er würde den Namespace nicht kennen. Es ist aber die gleiche Java und Xalan Version.
Also habe ich den Namespace manuell ins Files-Objekt gehängt:
Jetzt beschwert er sich zwar nicht mehr, kann aber nur noch XPath ausdrücke, die lediglich ein Element abfragen. Ob dieses Element mit oder ohne Namespace ist, ist dabei egal.
Meine Abfragen sehen z.B. so aus:
Die erste Abfrage gibt 5 Ergebnisse, die zweite 0, sollte aber auch 5 geben. Ich habe schon verschiedenste Varianten durchgespielt. Mit dem gleichen Ergebnis: wird nach mehr als einem Element gefragt, funktioniert es nicht mehr.
Ich habe mir auch schon beide Versionen in eine Datei ausgeben lassen, sie sehen beide gut aus und die XPath-Abfragen mit XMLSpy und anderen Tools funktionieren wunderbar.
Hat jemand eine Idee?
Liebe Grüße
Kirsten
Ich habe ein Problem mit Namespaces und XPath in Java DOM und so langsam weiß ich nicht, was ich noch tun soll. Vielleicht kann hier ja jemand helfen.
Angaben vorweg: Ich nutze Java 1.4.2 mit Xalan 2.6.0
Also: Ich habe eine XML-Datei, die ich mit XSLT transformiere. Das Ganze sieht so aus:
Code:
TransformerFactory tfactory = TransformerFactory.newInstance();
FileInputStream in = new FileInputStream(file);
inr = new InputStreamReader(in, "UTF-8");
StreamSource xmlStream = new StreamSource(inr);
StreamSource xsltStream = new StreamSource(xsltname);
DOMResult domresult = new DOMResult();
Transformer transformer = tfactory.newTransformer(xsltStream);
transformer.transform(xmlStream, domresult);
theNode = domresult.getNode();
Heraus kommt eine solche Struktur:
<Files>
<File name="datei1">
<Daten xmlns:xxx="yyy">... hier Daten und hier auch erst der Namespace ...</Daten>
</File>
...
</Files>
Bei mir funktionieren XPath-Abfragen ohne Probleme, auf dem Testrechner wo das ganze laufen soll, beschwert er sich bereits beim Abfragen von //File/@name er würde den Namespace nicht kennen. Es ist aber die gleiche Java und Xalan Version.
Also habe ich den Namespace manuell ins Files-Objekt gehängt:
Code:
//Transformation wie oben
tempdoc = factory.newDocumentBuilder().newDocument();
Element elem = tempdoc.createElement("Files");
elem.setAttribute("xmlns:xxx", "yyy");
//Den ersten Unterknoten kopieren
Element impfNode = (Element)tempdoc.importNode(tempNode.getFirstChild(), true);
elem.appendChild(impfNode);
//Alle anderen Unterknoten kopieren
..... --> Ist ne Schleife, habe ich mal weggelassen
theNode = (Node)elem;
Jetzt beschwert er sich zwar nicht mehr, kann aber nur noch XPath ausdrücke, die lediglich ein Element abfragen. Ob dieses Element mit oder ohne Namespace ist, ist dabei egal.
Meine Abfragen sehen z.B. so aus:
Code:
NodeList d3Names = org.apache.xpath.XPathAPI.selectNodeList(this.theNode, "//Daten");
System.out.println("Variante 1: " + d3Names.getLength());
NodeList dNames = org.apache.xpath.XPathAPI.selectNodeList(this.theNode, "//File/Daten");
System.out.println("Variante 2: " + dNames.getLength());
Die erste Abfrage gibt 5 Ergebnisse, die zweite 0, sollte aber auch 5 geben. Ich habe schon verschiedenste Varianten durchgespielt. Mit dem gleichen Ergebnis: wird nach mehr als einem Element gefragt, funktioniert es nicht mehr.
Ich habe mir auch schon beide Versionen in eine Datei ausgeben lassen, sie sehen beide gut aus und die XPath-Abfragen mit XMLSpy und anderen Tools funktionieren wunderbar.
Hat jemand eine Idee?
Liebe Grüße
Kirsten