# XPath Namensräume und auslesen einzelner Knoten



## Itzamna (21. Mai 2012)

Hallo Zusammen,

ich habe folgenden XML String, woraus ich Werte (Liste mit allen DATEI_IDs) ermitteln muss:

```
<PPT_METADATA xmlns="http://123.45.312.76:8080/ppt.xsd" xmlns:pptxml="http://123.45.312.76:8080/ppt.xsd" version="1.2" ><LISTE><DATEI><DATEI_ID>1</DATEI_ID></DATEI><DATEI><DATEI_ID>2</DATEI_ID></DATEI><DATEI><DATEI_ID>3</DATEI_ID></DATEI></LISTE></PPT_METADATA>
```

Das ganze mache ich wie folgt:

```
Document doc = " ... das XML von oben ... ";
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//PPT_METADATA/Liste/*/DATEI_ID/text()");
NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; nodes.getLength(); i++)
{
 Node node = nodes.item(i);
 System.out.println(node.getNodeValue);
}
```

Also die XPath-Expression ist

```
//PPT_METADATA/Liste/*/DATEI_ID/text()
```

Das funktioniert aber nur mit dem Namensraum "xmlnsptxml", sobald der zweite Namensraum (xmlns) im XML vorhanden ist, werden keine Ergebnisse zurückgegeben.

Meine Frage:
Wie bekomme ich die Expression so hin, dass sie auch bei Angabe beider Namensräume die "DATEI_ID" ermittelt? Die Angabe beider Namensräume muss ich so hinnehmen, da die XML-Datei von einem Fremdsystem geliefert wird.

Kann mir hierzu jemand auf die Sprünge helfen?

Vielen Dank,
Itzamna


----------



## SlaterB (22. Mai 2012)

sicher dass es nicht an abweichender Schreibweise Liste/ LISTE liegt?
mit Liste wird bei mir in allen Varianten nichts gefunden, mit LISTE immer

für andere komplett:

```
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = dfactory.newDocumentBuilder();

        String st = "<PPT_METADATA xmlns=\"http://123.45.312.76:8080/ppt.xsd\" xmlns:pptxml=\"http://123.45.312.76:8080/ppt.xsd\" version=\"1.2\" ><LISTE><DATEI><DATEI_ID>1</DATEI_ID></DATEI><DATEI><DATEI_ID>2</DATEI_ID></DATEI><DATEI><DATEI_ID>3</DATEI_ID></DATEI></LISTE></PPT_METADATA>";
        // vielleicht nicht ideal, aber eine Lösung die mir gerade einfiel um Datei zu sparen
        ByteArrayInputStream in = new ByteArrayInputStream(st.getBytes());
        Document doc = builder.parse(in);

        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        XPathExpression expr = xpath.compile("//PPT_METADATA/LISTE/*/DATEI_ID/text()");
        NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
        for (int i = 0; i < nodes.getLength(); i++)
        {
            Node node = nodes.item(i);
            System.out.println(node.getNodeValue());
        }
    }
}
```
generell testen, ob zumindest '//PPT_METADATA' gefunden wird und danach immer detaillierter bis zum Fehler


----------



## Itzamna (22. Mai 2012)

Hallo,

danke für die Antwort. Nein, das mit der Liste anstatt LISTE war ein Tippfehler hier im Beitrag. 
Leider funktioniert das so bei mir nicht, nur wenn ich den "xmlns" entferne und nur "xmlnsptxml" stehen lasse klappt es.


----------



## SlaterB (22. Mai 2012)

da du doch nicht 100%-eindeutig ausdrückst:
hast du mein Programm kopiert und ausprobiert und funktioniert das bei dir wirklich nicht?

was in deiner Original-Umgebung nicht klappt ist eben nicht genau erkennbar, 
nur vollständige Testprogramme wie meins sind richtig eindeutig, 
jedenfalls ist das zu hoffen, wenn es bei dir nicht gehen sollte, dann vielleicht von irgendwelchen lokalen Einstellungen wie Java-Version abhängig..

> generell testen, ob zumindest '//PPT_METADATA' gefunden wird
schon ausprobiert?


----------

