2008-12-04 27 views
8

Tôi có một XML có cấu trúc tương tự như sau:XML Parsing với XPath trong Java

<category> 
    <subCategoryList> 
     <category> 

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

Tôi có một lớp Category có một danh sách subcategory (List<Category>). Tôi đang cố gắng phân tích cú pháp tệp XML này bằng XPath, nhưng tôi không thể lấy các danh mục con của một danh mục.

Làm cách nào tôi có thể thực hiện việc này với XPath? Có cách nào tốt hơn để làm điều này?

+0

"Và vân vân" ... điều quan trọng là – tcurdt

+0

Ngoài ra, câu hỏi là tệp của bạn lớn đến cỡ nào. – tcurdt

Trả lời

18

This link có mọi thứ bạn cần. Trong quần short:

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

Tôi tin rằng biểu thức XPath cho điều này sẽ là "//category/subCategoryList/category". Nếu bạn chỉ muốn con của nút gốc category (giả sử nó là nút gốc của tài liệu), hãy thử "/category/subCategoryList/category".

+0

có, nhưng điều này trả về cho tôi một danh sách tất cả các nút phù hợp với biểu thức đó, vì vậy tất cả các đứa trẻ được bao gồm ... cảm ơn –

+0

Ý của bạn là gì? Tôi nghĩ rằng bạn đang để lại một số chi tiết. – sblundy

0

này sẽ làm việc cho bạn:

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

Sau đó, bạn có thể phân tích những đứa trẻ của thể loại như bạn muốn.