2010-12-24 76 views
7

Với một tài liệu xml trông giống như sau:Lấy giá trị của nút XML và thuộc tính nút sử dụng XPath trong JAXP

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> 
    <entry key="agentType">STANDARD</entry> 
    <entry key="DestinationTransferStates"></entry> 
    <entry key="AgentStatusPublishRate">300</entry> 
    <entry key="agentVersion">f000-703-GM2-20101109-1550</entry> 
    <entry key="CommandTimeUTC">2010-12-24T02:25:43Z</entry> 
    <entry key="PublishTimeUTC">2010-12-24T02:26:09Z</entry> 
    <entry key="queueManager">AGENTQMGR</entry> 
</properties> 

Tôi muốn in các giá trị của thuộc tính "then chốt" và yếu tố như vậy có vẻ như thế này:

agentType = STANDARD 
DestinationTransferStates = 
AgentStatusPublishRate = 300 
agentVersion = f000-703-GM2-20101109-1550 
CommandTimeUTC = 2010-12-24T02:25:43Z 
PublishTimeUTC = 2010-12-24T02:26:09Z 
queueManager = AGENTQMGR 

tôi có thể in các giá trị nút với không có vấn đề sử dụng mã này:

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
XPathExpression expr = xpath.compile("//properties/entry/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()); 
} 

Và tôi có thể in các giá trị của thuộc tính "chìa khóa" bằng cách thay đổi biểu thức xpath và các phương pháp nút như sau:

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
XPathExpression expr = xpath.compile("//properties/entry"); 
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).getAttributes().getNamedItem("key").getNodeValue()); 
} 

Nó có vẻ như sẽ có một cách để có được ở cả hai giá trị trong một đơn evaluate. Tôi luôn có thể đánh giá hai NodeLists và lặp qua chúng với một chỉ mục chung nhưng tôi không chắc chắn rằng chúng được đảm bảo được trả về theo thứ tự như nhau. Mọi đề xuất đều được đánh giá cao.

+0

có vẻ như mã xml của jaxp khá lộn xộn, bạn có mở các loại xml apis khác không? –

+0

Khi tôi nhận được mã JAXP hoạt động, tôi đã viết nó trong XSLT. Đó là một trình dọn dẹp rất nhiều (trông giống như HTML với một số đánh dấu bổ sung) nhưng mất mãi mãi để render. Tôi sẽ thử XSLT với một translet tiếp theo. Đề xuất khác chắc chắn chào đón. –

Trả lời

11

Còn khoảng getTextContent() thì sao? Điều này nên làm công việc.

Object result = expr.evaluate(doc, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) 
{ 
    Node currentItem = nodes.item(i); 
    String key = currentItem.getAttributes().getNamedItem("key").getNodeValue(); 
    String value = currentItem.getTextContent(); 

    System.out.printf("%1s = %2s\n", key, value); 
} 

Để biết thêm thông tin, vui lòng xem javadoc cho getTextContent(). Tôi hy vọng điều này sẽ giúp bạn.

+0

Sao chép, dán, hoạt động hoàn hảo. Cảm ơn! Tôi sẽ đi xem xét kỹ hơn về phương thức getTextContent(). –

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