2012-04-10 39 views
5

Tôi đã có một phần của XML trông như thế này:làm thế nào để có được một giá trị nút trong XPath - Java

<entry> 
<id>tag:example.com,2005:Release/343597</id> 
<published>2012-04-10T11:29:19Z</published> 
<updated>2012-04-10T12:04:41Z</updated> 
<link type="text/html" href="http://example.com/projects/example1" rel="alternate"/> 
<title>example1</title> 
</entry> 

tôi cần phải lấy liên kết http://example.com/projects/example1 từ khối này. Tôi không chắc chắn làm thế nào để làm điều này. Để có được danh hiệu của dự án tôi sử dụng mã này:

String title1 = children.item(9).getFirstChild().getNodeValue(); 

nơi children là đối tượng getChildNodes() cho khối <entry> </entry>. Nhưng tôi tiếp tục nhận được NullPointerExceptions khi tôi cố gắng lấy giá trị nút cho nút <link> theo cách tương tự. Tôi thấy rằng mã XML khác với nút <link> và tôi không chắc giá trị của nó là gì .... Vui lòng thông báo!

+0

Bạn có cần cú pháp XPath cho việc này? Hoặc bạn cần cú pháp Java API? –

+1

Ahh, câu hỏi hay, tìm kiếm cú pháp Java API. Nhưng tôi đã làm việc đó, xem bên dưới. Cảm ơn – blaughli

Trả lời

13

Biểu thức XPath để có được nút đó là

//entry/link/@href 

Trong java bạn có thể viết

Document doc = ... // your XML document 
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//entry/link/@href"); 
String href = xp.evaluate(doc); 

Sau đó, nếu bạn cần để có được giá trị link của sự xâm nhập với một cụ id bạn có thể thay đổi biểu thức xpath đến

//entry[id='tag:example.com,2005:Release/343597']/link/@href 

Cuối cùng nếu bạn muốn nhận được tất cả các liên kết trong văn bản, nếu tài liệu có nhiều yếu tố nhập bạn có thể viết

Document doc = ... // your XML document 
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//entry/link/@href"); 
NodeList links = (NodeList) xp.evaluate(doc, XPathConstants.NODESET); 
// and iterate on links 
+1

Cảm ơn dash1e, bạn đã đẩy tôi đi đúng hướng. Sử dụng cú pháp bạn đã cung cấp, tôi đã có thể đánh giá biểu thức Xpath đã biên dịch (trả lại kết quả dưới dạng 'NODESET'). Sau đó tôi thực hiện một NodeList từ kết quả (NODESET), và sau đó tôi lặp lại thông qua một vòng lặp while để lấy tất cả các liên kết từ trang RSS mà tôi đang đọc. Cảm ơn nhiều :). – blaughli

+0

Tôi cũng thêm vào câu trả lời ví dụ 'NodeList'. Để hoàn thành. – dash1e

6

Đây là mã hoàn chỉnh:

DocumentBuilderFactory domFactory = DocumentBuilderFactory 
      .newInstance(); 
    domFactory.setNamespaceAware(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document doc = builder.parse("test.xml"); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    XPathExpression expr = xpath.compile("//entry/link/@href"); 
    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)); 
    } 
+0

Cảm ơn Phani, đó là chính xác những gì tôi đã làm. – blaughli

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