2012-05-24 7 views
11

ich eine XPath-Abfrage auf diese XML-Datei vornehmen möchten (Auszug dargestellt):Java XPath: alle Elemente erhalten, die eine Abfrage entsprechen

<?xml version="1.0" encoding="UTF-8"?> 
<!-- MetaDataAPI generated on: Friday, May 25, 2007 3:26:31 PM CEST --> 
<Component xmlns="http://xml.sap.com/2002/10/metamodel/webdynpro" xmlns:IDX="urn:sap.com:WebDynpro.Component:2.0" mmRelease="6.30" mmVersion="2.0" mmTimestamp="1180099591892" name="MassimaleContr" package="com.bi.massimalecontr" masterLanguage="it"> 
... 
    <Component.UsedModels> 
     <Core.Reference package="com.test.test" name="MasterModel" type="Model"/> 
     <Core.Reference package="com.test.massimalecontr" name="MassimaleModel" type="Model"/> 
     <Core.Reference package="com.test.test" name="TravelModel" type="Model"/> 
    </Component.UsedModels> 
... 

Ich verwende diesen Code-Snippet:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
domFactory.setNamespaceAware(true); 
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
Document document = builder.parse(new File("E:\\Test branch\\test.wdcomponent")); 
XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 

xpath.setNamespaceContext(new NamespaceContext() { 
...(omitted) 

System.out.println(xpath.evaluate(
    "//d:Component/d:Component.UsedModels/d:Core.Reference/@name", 
    document)); 

Was ich erwarte zu bekommen:

MasterModel 
MassimaleModel 
TravelModel 

Was ich bekomme:

MasterModel 

Es scheint, dass nur das erste Element zurückgegeben wird. Wie kann ich alle Vorkommen erhalten, die meiner Abfrage entsprechen?

+0

Sie können versuchen dies '// d: Komponente/d: Component.UsedModels/@ name' nicht wirklich sicher, es funktioniert in Java. Es funktioniert in Python. :) – Bob

Antwort

20

Sie werden einen Artikel vom Typ NodeList

XPathExpression expr = xpath.compile("//Core.Reference"); 
NodeList list= (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
for (int i = 0; i < list.getLength(); i++) { 
    Node node = list.item(i); 
    System.out.println(node.getTextContent()); 
    // work with node 
3

Siehe How to read XML using XPath in Java

Gemäß diesem Beispiel erhalten, wenn Sie zuerst der Ausdruck XPath kompilieren dann ausführen, dass Sie eine nodeset Sie spezifizieren zurück sollte das gewünschte Ergebnis erhalten.

Verwandte Themen