XPATH - JDOM Abfrage

clemi32

Grünschnabel
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

Code:
    <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

Code:
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

Code:
  //mdWrap/xmldata/node()/text()

mache, dann werden zwar alle 3 elemente zurückgegeben, aber diese in folgendem Format:
Code:
    "[Text: Bovet, Theodor]"
    "[Text: Von Mann zu Mann]"
    "[Text: Reifezeit]"


meine frage ist nun, mit welcher abfrage ich ALLE elemente im format
Code:
"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......
 
Zuletzt bearbeitet:
wenn ich nur
Code:
   //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
Code:
[Text: ]
weg
 
Zuletzt bearbeitet:
ich habe gerade die abfrage
Code:
normalize-space(//mdWrap/xmldata/node()/text())
ausprobiert, und es wird wieder nur das erste element ausgegeben. dies aber daür in der gewollten form....
 
Hallo!

Also mit Standard Java (5.0) bekomme ich mit:
Code:
/*
 * 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:
Code:
<?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:
Code:
            String res = xPath.evaluate("//*", doc);

erhalte ich:
Bovet, Theodor
Von Mann zu Mann
Reifezeit

Gruß Tom
 
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
 
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...)
 
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
 
Hallo!

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

Code:
...
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:
Code:
Text 1: Bovet, Theodor
Text 2: Von Mann zu Mann
Text 3: Reifezeit

Gruß Tom
 
Zurück