2008-12-04 20 views
8

Tengo un XML con una estructura similar a esto:análisis XML con XPath en Java

<category> 
    <subCategoryList> 
     <category> 

     </category> 
     <category> 
     <!--and so on --> 
     </category> 
    </subCategoryList> 
</category> 

tengo una clase Categoría que tiene una lista subcategory (List<Category>). Estoy tratando de analizar este archivo XML con XPath, pero no puedo obtener las categorías secundarias de una categoría.

¿Cómo puedo hacer esto con XPath? ¿Hay una mejor manera de hacer esto?

+0

¿Qué es el "y así sucesivamente" ... eso es importante – tcurdt

+0

También la pregunta es qué tan grande será su archivo. – tcurdt

Respuesta

18

This link tiene todo lo que necesita. En cortocircuitos:

public static void main(String[] args) 
    throws ParserConfigurationException, SAXException, 
      IOException, XPathExpressionException { 

    DocumentBuilderFactory domFactory = 
    DocumentBuilderFactory.newInstance(); 
      domFactory.setNamespaceAware(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document doc = builder.parse("persons.xml"); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
     // XPath Query for showing all nodes value 
    XPathExpression expr = xpath.compile("//person/*/text()"); 

    Object result = expr.evaluate(doc, XPathConstants.NODESET); 
    NodeList nodes = (NodeList) result; 
    for (int i = 0; i < nodes.getLength(); i++) { 
    System.out.println(nodes.item(i).getNodeValue()); 
    } 
    } 
2

Creo que la expresión XPath para esto sería "//category/subCategoryList/category". Si solo desea los elementos secundarios del nodo raíz category (suponiendo que sea el nodo raíz del documento), intente con "/category/subCategoryList/category".

+0

sí, pero esto me devuelve una lista de todos los nodos que coinciden con esa expresión, por lo que todos los elementos secundarios están incluidos ... gracias –

+0

¿Qué quiere decir con todos los niños incluidos? Creo que estás omitiendo algunos detalles. – sblundy

0

Esto funcionará para usted:

NodeList nodes = (NodeList) xpath.evaluate("//category//subCategoryList/category", 
inputSource, XPathConstants.NODESET); 

A continuación, puede analizar los hijos de categoría que desea.