# XPATH - JDOM Abfrage



## clemi32 (3. Januar 2005)

Hallo!

    Ich habe folgendes Problem: 

    Ich möchte in JAVA eine Applikation realisieren, welche mir aus einem XML-File mittels XPath-Abfrage Element-Inhalte liefert.

    Meine XML-Datei sieht in etwa so aus


```
<mdWrap MIMETYPE="text/xml" MDTYPE="DC">
    <xmldata>
    <dc:creator>Bovet, Theodor</dc:creator>
    <dc:title>Von Mann zu Mann</dc:title>
    <dc:title>Reifezeit</dc:title>
    </xmldata>
    </mdWrap>
```
 
 und jetzt möchte ich mit einer eben solchen xpath abfrage und der methode JDOM.XPath.selectNodes() alle inhalte der Elemente creator und title bekommen.

    ich möchte also, dass mir die werte "Bovet, Theodor", "Von Mann zu Mann" und "Reifezeit" zurückgegeben werden.

    soweit ich weiss müsste die dazugehörige abfrage


```
string(//mdWrap/xmldata/node()/text())
```
 
    lauten...

    bei dieser abfrage wird aber nur das erste Element zurückgegeben.... (und zwar so: "Bovet, Theodor")

    wenn ich eine abfrage mit


```
//mdWrap/xmldata/node()/text()
```
 
    mache, dann werden zwar alle 3 elemente zurückgegeben, aber diese in folgendem Format:

```
"[Text: Bovet, Theodor]"
    "[Text: Von Mann zu Mann]"
    "[Text: Reifezeit]"
```
 

    meine frage ist nun, mit welcher abfrage ich ALLE elemente im format

```
"Bovet, Theodor"
  "Von Mann zu Mann"
  "Reifezeit"
```
 bekomme.

    ich habe die vorahnung dass mit der funktion string(...) bei xpath nur das erste element abgefragt wird......


----------



## Thomas Darimont (3. Januar 2005)

Hallo!

Hast du's schon mal mit diesem Ausdruck versucht:

```
//text()
```

Gruß Tom


----------



## clemi32 (3. Januar 2005)

wenn ich nur 

```
//text()
```
   abfrage, dann liefert er mir das gleiche ergebnis.

 hat es vielleicht etwas mit dem string() zu tun. dass vielleicht bei dieser funktion immer nur das erste element zurückgegeben wird....


  oder wie bekomme ich dieses

```
[Text: ]
```
 weg


----------



## clemi32 (3. Januar 2005)

ich habe gerade die abfrage

```
normalize-space(//mdWrap/xmldata/node()/text())
```
 ausprobiert, und es wird wieder nur das erste element ausgegeben. dies aber daür in der gewollten form....


----------



## Thomas Darimont (3. Januar 2005)

Hallo!

Also mit Standard Java (5.0) bekomme ich mit:

```
/*
 * Created on 03.01.2005@10:55:02
 *
 * TODO Explain me...
 */
package de.tutorials;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

/**
 * @author Darimont
 *
 * TODO Comment me
 */
public class XPathExample {

    public static void main(String[] args) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(XPathExample.class
                    .getResourceAsStream("foo.xml"));
            XPathFactory xPathFactory = XPathFactory.newInstance();
            
            XPath xPath = xPathFactory.newXPath();
            String res = xPath.evaluate("normalize-space(//*)", doc);
            System.out.println(res);

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }
    }
}
```

Folgende Ausgabe:


> Bovet, Theodor Von Mann zu Mann Reifezeit



foo.xml:

```
<?xml version="1.0"?>
<mdWrap MIMETYPE="text/xml">
   <xmldata>
      <creator>Bovet, Theodor</creator>
      <title>Von Mann zu Mann</title>
      <title>Reifezeit</title>
   </xmldata>
</mdWrap>
```

Lasseich das normalize-space weg:

```
String res = xPath.evaluate("//*", doc);
```

erhalte ich:


> Bovet, Theodor
> Von Mann zu Mann
> Reifezeit



Gruß Tom


----------



## clemi32 (3. Januar 2005)

hmm, ich benutze j2sdk1.4.2_06 und arbeite mit der XPath-Klasse von org.jdom.xpath.XPath.

 da dürfte ja eigentlich kein unterschied bestehen, zwischen beiden, oder


----------



## clemi32 (3. Januar 2005)

und bei der zweiten ausgabe (sobald du normalize-space) weg lässt, ist die ausgabe dann 1 lange string, oder 3 separate strings?

  denn ich würde 3 strings benötigen (und nicht alles in einer langen string-wurst...)


----------



## Thomas Darimont (3. Januar 2005)

Hallo!

Leider kann ich mir derweil keine JDom distribution laden... na ja, hast du Dir schon mal dom4j angesehen? Viele Leute sagen, dass dom4j besser wäre als jdom, hinlänglich Useability und Performance.

Mit und ohne "normalize-string" ist es ein String. Wobei letzterer Zeilenumbrüche enthält.

Gruß Tom


----------



## clemi32 (3. Januar 2005)

hmm, dann werd ich mir mal das dom4j anschauen...

 vielen dank für die schnellen antworten


----------



## Thomas Darimont (3. Januar 2005)

Hallo!

"Zur Not" könntest du auch mal folgendes Versuchen:


```
...
import com.sun.org.apache.xpath.internal.XPathAPI;
...
            NodeList list = XPathAPI.selectNodeList(doc, "//text()");
            int len = list.getLength();
            int j = 0;
            for (int i = 0; i < len; i++) {
                Text text = (Text) list.item(i);
                String textContent = text.getTextContent().trim();
                if (textContent.equals(""))
                    continue;
                System.out.println("Text " + (++j) + ": " + textContent);
            }
```

Ergibt folgende Ausgabe:

```
Text 1: Bovet, Theodor
Text 2: Von Mann zu Mann
Text 3: Reifezeit
```

Gruß Tom


----------

