2017-09-11 3 views
0

Ich bin mit Java XPathFactory Werte von einer einfachen XML-Datei zu erhalten:java XPath-Liste Verketten

<Obama> 
    <coolnessId>0</coolnessId> 
    <cars>0</cars> 
    <cars>1</cars> 
    <cars>2</cars> 
</Obama> 

Mit dem xpression //Obama/coolnessId | //Obama/cars das Ergebnis:

0 
0 
1 
2 

Aus diesem Ergebnis I kann nicht unterscheiden zwischen was ist die coolnessId und was ist die Auto ID. Ich müsste so etwas wie:

CoolnessId: 0 
CarId: 0 
CarId: 1 
CarId: 2 

Mit concat('c_id: ', //Obama/coolnessId,' car_id: ',//Obama/cars) Ich bin nah an der Lösung, aber concat kann nicht für eine Werteliste verwendet werden. Leider kann ich string-join nicht verwenden, weil es in meiner Xpath-Bibliothek nicht bekannt zu sein scheint. Und ich kann das gegebene XML nicht manipulieren.

Welche anderen Tricks kann ich verwenden, um eine Liste von Werten mit etwas wie einem Alias ​​zu erhalten?

+0

Mögliches Duplikat von [Abrufen von Elementnamen mit XPath/XQuery] (https://stackoverflow.com/questions/11121089/getting-element-names-using-xpath-xquery) – DMC19

+0

Wenn Sie zwischen den beiden unterscheiden müssen, Warum nur einen Weg benutzen? – daniu

Antwort

1

Wenn Sie die Elemente, anstatt ihre Textinhalte wählen werden Sie einige Kontext haben:

public static void main(String[] args) throws Exception { 

    String xml = 
     "<Obama>" + 
     " <coolnessId>0</coolnessId>" + 
     " <cars>0</cars>" + 
     " <cars>1</cars>" + 
     " <cars>2</cars>" + 
     "</Obama>"; 

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true); 

    Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 

    XPathExpression expr = xpath.compile("//Obama/cars | //Obama/coolnessId"); 
    NodeList result = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
    for (int i = 0; i < result.getLength(); i++) { 
     Element item = (Element) result.item(i); 
     System.out.println(item.getTagName() + ": " + item.getTextContent()); 
    } 
} 
1

Angenommen, Sie fragen nach dem Ergebnis der Auswertung als NodeList, Ihre XPath-Ausdruck gibt tatsächlich eine Folge von vier Element-Knoten, keine Sequenz von vier Strings, wie Sie vorschlagen. Wenn Ihre Eingabe das DOM-Baummodell verwendet, werden diese in Form einer DOM-NodeList zurückgegeben. Sie können die Node-Objekte in dieser NodeList verarbeiten, um die Namen der Knoten sowie deren String-Werte abzurufen.

Wenn Sie auf ein XPath 3.1-Engine wie Saxon wechseln, können Sie das Ergebnis direkt als einzelne Zeichenfolge mit dem XPath-Ausdruck erhalten:

string-join((//Obama/coolnessId | //Obama/cars) ! (name() || ': ' || string()), '\n') 

Um XPath-Ausdrücke in Saxon aufrufen können Sie entweder die JAXP verwenden API (javax.xml.xpath) oder Saxons s9api-Schnittstelle: Ich würde s9api empfehlen, weil es das umfassendere System von XPath 2.0 und darüber hinaus versteht.