2008-12-04 18 views
8

Mam XML o strukturze podobnej do tej:Przetwarzanie XML z XPath w Javie

<category> 
    <subCategoryList> 
     <category> 

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

Mam klasy kategorię, która ma subcategory listy (List<Category>). Próbuję przeanalizować ten plik XML za pomocą XPath, ale nie mogę uzyskać kategorii podrzędnych kategorii.

Jak mogę to zrobić z XPath? Czy jest lepszy sposób to zrobić?

+0

Co to jest "i tak dalej" ... to ważne – tcurdt

+0

Również pytanie brzmi, jak duży będzie twój plik. – tcurdt

Odpowiedz

18

This link ma wszystko, czego potrzebujesz. W szortach:

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

Wierzę, że wyrażenie XPath dla tego będzie "//category/subCategoryList/category". Jeśli chcesz tylko dzieci węzła głównego (zakładając, że jest to główny węzeł dokumentu), spróbuj "/category/subCategoryList/category".

+0

tak, ale to zwraca mi listę wszystkich węzłów, które pasują do tego wyrażenia, więc wszystkie dzieci są uwzględnione ... dzięki –

+0

Co masz na myśli, że wszystkie dzieci są uwzględnione? Myślę, że zapominasz o niektórych szczegółach. – sblundy

0

To będzie pracować dla Ciebie:

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

Następnie można analizować dzieci kategorii, jak chcesz.