XPath Text Nodes

Hallo zusammen,

ich bin dabei eine Anwendung zu programmieren, die ein mir unbekanntes xml einlesen können soll. Die einzige Einschränkung ist, dass die Struktur in etwa so aussieht:

[XML]

text
text
text


text
text
text


text
text
text


text
text
text

[/XML]

Das soll bedeuten, einen Text als Inhalt haben nur a, b und c. Diese Nodes müssen sich auch immer auf der untersten Ebene befinden.
Wenn ich nun Xpath benutze, wie kann ich dann nur a, b und c selektieren? (jedes Mal)

            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xmlFile);
            doc.getDocumentElement().normalize();
                  
            XPath xPath = XPathFactory.newInstance().newXPath();
            String expr = "//*[text()]";

            NodeList nl = (NodeList) xPath.evaluate(expr, doc, XPathConstants.NODESET);
            
            for (int i = 0; i < nl.getLength(); i++){
                System.out.println(nl.item(i).getNodeName() + " ");
            }



Mir geht es um die Methode text(). Kann ich die so verändern, dass nur die nodes der 3. Ebene erfasst werden?

Danke und viele Grüße
tulpenbaum

Kurze Antwort: Ja.

Ich glaube /*/*/*[text()] sollte das schon erledigen. Dann solltest du den von jedem Element in der dritten Ebene bekommen. Wenn du das nur für a, b und c möchtest sollte dass den Job erledigen:


/*/*/a[text()] | /*/*/b[text()] | /*/*/c[text()]

Alles ohne Garantie: Das ist einfach so aus dem Ärmel geschüttelt.

Hallo Schlingel,

danke für die Antwort. Diese Lösung kenne ich, jedoch ist mein Problem, dass ich das xml-Dok nicht kenne, also können es auch nur 2 oder 4 Ebenen sein, ich weiß nur, dass es auf der untersten den für mich interessanten Teil gibt.

Viele Grüße

Kennst du die Namen der interessanten Knoten? Das wäre dann //*/a[text()].

Wenn du nur die untersten Knoten willst, habe ich hier auf SO eine Lösung gefunden:


//node()[not(node())]

Danke, das hilft mir sehr!

Noch mehr würde es helfen, dem Liferanten des XML eine XSD vorzugeben, an die er sich halten muss…

bye
TT

Die Antwort ist so richtig wie sie nutzlos ist.