# XPath



## reibi (19. Jan 2011)

Habe beim auslesen eines XPAths das Problem das ich nicht unterscheiden kann, ob es den Wert gibt oder ob er einfach auf ""(lerer String) gesetzt ist.


```
XPathExpression expr = xpath.compile(""//inventory/book[1]/@diesesAttributGibtsGarNicht"");
        String result = (String)expr.evaluate(doc, XPathConstants.STRING);
```

Bei dem Beispiel kommt sowas --> "" zurück. Also ein leerer String. Ich würde aber am liebsten null erwarten, das mir signalisiert, das dieser XPath nicht valiede ist. Wenn "" zurückkommt, muss ich eigentlich annehmen, das der XPath valide ist, aber nichts drin steht. Is aber leider nich so mit dem MisX.


Weiss da jemand wie ichs machen kann?

Gruss


----------



## Noctarius (19. Jan 2011)

Also das da oben kompiliert doch gar nicht oder habe ich deine Frage falsch verstanden?


----------



## reibi (19. Jan 2011)

Hi Noctarius

Naja, das ist ja auch nur ein Ausschnitt von nem üblichen XPath-abzug.

ich mach mal was compilierungsfähiges:


```
import org.w3c.dom.Document;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;


public class TestXPath {
    public static void main(String[] args) throws Exception {
        File myXMLFile = new File("src/main/java/test/xp/books.xml");

        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true); // never forget this!

        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse(myXMLFile);

        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        XPathExpression expr = xpath.compile("//inventory/book[1]/@diesesAttributGibtsGarNicht");
        String result = (String) expr.evaluate(doc, XPathConstants.STRING);

        System.out.println("\"" + result + "\"");
    } // end main()
} // end TestXPath
```

Kannste so ausführen mit Angabe eines XML-Files

Gruzss


----------



## Noctarius (19. Jan 2011)

Und bei welchem XML erwartest du welche Ausgabe?


----------



## reibi (19. Jan 2011)

OK... passendes XML:


Dat ding heisst books.xml

[XML]
<inventory>
    <book year="2000">
        <title>Snow Crash</title>
        <author>Neal Stephenson</author>
        <publisher>Spectra</publisher>
        <isbn>0553380958</isbn>
        <price>14.95</price>
    </book>

    <book year="2005">
        <title>Burning Tower</title>
        <author>Larry Niven</author>
        <author>Jerry Pournelle</author>
        <publisher>Pocket</publisher>
        <isbn>0743416910</isbn>
        <price>5.99</price>
    </book>

    <book year="1995">
        <title>Zodiac</title>
        <author>Neal Stephenson</author>
        <publisher>Spectra</publisher>
        <isbn>0553573862</isbn>
        <price>7.50</price>
    </book>

    <!-- more books... -->

</inventory>
[/XML]

Gruss


----------



## eRaaaa (19. Jan 2011)

Anstelle dir den String zu holen könntest du dir den Node holen

```
Node result = (Node) expr.evaluate(doc, XPathConstants.NODE);
```

Das sollte null liefern. Wenn es das Attribut gibt, kannste` dir den Inhalt wiederum über 
	
	
	
	





```
result.getTextContent()
```
 holen


----------



## reibi (19. Jan 2011)

Wie finde ich raus ob es das Attribut gibt?


----------



## eRaaaa (19. Jan 2011)

Mhm? Ok ich glaube jetzt auch, dass ich dich missverstanden habe :autsch:

Du willst doch ein Attribut von dem ersten Buch selektieren oder? Wenn es das Attribut gibt ,bzw allgemein der XPath stimmt(es eine Ergebnissmenge gibt) sollte es dir != null zurückgeben, ansonsten ist der Node eben null. Das war doch das was du wolltest oder nicht?


----------



## reibi (19. Jan 2011)

Hi eRaaa

Also wenn der Pfad exiastiert, dannn soll es mir das ausgeben was drin steht, auch wenn ein leerer String drin steht. Wenn es den Pfad nicht gibt, dann soll er null zurückliefern.

gruss


----------



## eRaaaa (19. Jan 2011)

Und was genau geht jetzt an dem von mir vorgeschlagenem Weg nicht?

```
Node result = (Node) expr.evaluate(doc, XPathConstants.NODE);
		System.out.println("\"" + (result!=null?result.getTextContent():result) + "\"");
```

Auf dein Beispiel bezogen sollte es bei @year --> "2000" liefern. Gibt es den Pfad nicht, sollte "null" ausgegeben werden... Oder tuts das nicht? <-- das war eig. meine Frage ;/


----------



## reibi (19. Jan 2011)

1.) Das hier : The method getTextContent() is undefined for the type Node

2.) Ist das n spezialweg für Attribute.
Wenn der Wert, den ich ziehen will, sich in nem ELEMENT befindet, geht dieser weg nicht. 
Einen speziellen XPath will ich konfigurierbar machen, unabhängig von einem Element-Inhalt, Attribut oder Liste

Dafür ist ja XPath auch da oder?
gruss


----------



## Noctarius (19. Jan 2011)

Versuche statt getTextContent() mal getNodeValue(),


----------



## reibi (19. Jan 2011)

neee, mir is nämlich dank Euch ne andere Idee gekommen, folgendes ist wieder allgemeingültig:


```
//------
        String result = (String) expr.evaluate(doc, XPathConstants.STRING);
        Node node = (Node) expr.evaluate(doc, XPathConstants.NODE);
        //------

        String returnValue = null;
        if (node != null) {
			returnValue=result;
		} 

        
        System.out.println(returnValue);
```

läuft astrein ;-)


----------



## Noctarius (19. Jan 2011)

```
//------
        Node node = (Node) expr.evaluate(doc, XPathConstants.NODE);
        //------
 
        String returnValue = null;
        if (node != null) {
            returnValue=node.getNodeValue();
        } 
 
        
        System.out.println(returnValue);
```

Du machst damit unnötig viele Selections.


----------



## reibi (19. Jan 2011)

Hast recht ! danke ;-)


----------

