2012-05-24 31 views
11

Tôi muốn thực hiện một truy vấn XPath trên file XML này (đoạn trích được hiển thị):Java XPath: Nhận tất cả các yếu tố phù hợp với một truy vấn

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

Tôi đang sử dụng đoạn mã này:

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

Những gì tôi đang mong đợi để có được:

MasterModel 
MassimaleModel 
TravelModel 

gì tôi nhận được:

MasterModel 

Dường như chỉ có phần tử đầu tiên được trả về. Làm thế nào tôi có thể nhận được tất cả các lần xuất hiện phù hợp với truy vấn của tôi?

+0

Bạn có thể thử điều này '// d: Component/d: Component.UsedModels/@ name' không thực sự chắc chắn nó hoạt động trong java. Nó hoạt động trong python. :) – Bob

Trả lời

20

Bạn sẽ nhận được một mục kiểu 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

Xem How to read XML using XPath in Java

Theo ví dụ, Nếu bạn lần đầu tiên biên dịch biểu thức XPath sau đó thực hiện nó, chỉ rõ rằng bạn muốn có một nodeset lại bạn sẽ nhận được kết quả bạn muốn.

Các vấn đề liên quan