2012-05-24 14 views
11

Quiero hacer una consulta XPath en este archivo XML (extracto se muestra):Java XPath: Obtener todos los elementos que coinciden con una consulta

<?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> 
... 

estoy usando este fragmento de código:

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)); 

Lo que estoy esperando conseguir:

MasterModel 
MassimaleModel 
TravelModel 

Lo que quiero decir:

MasterModel 

Parece que solo se devuelve el primer elemento. ¿Cómo puedo obtener todas las ocurrencias que coinciden con mi consulta?

+0

Puede probar esto '// d: Component/d: Component.UsedModels/@ name' no muy seguro de que funcione en java. Funciona en python. :) – Bob

Respuesta

20

Usted obtendrá un elemento de tipo 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

Ver How to read XML using XPath in Java

Según ese ejemplo, Si primero compila la expresión XPath luego ejecutarlo, se especifica que desea una vuelta que nodeset debería obtener el resultado que desea

Cuestiones relacionadas