2013-01-14 26 views
6

Tôi đang sử dụng cho công việc DOM4j XML trong java, xml của tôi là như thế này:Dom4j SelectNodes (arg) không đưa ra danh sách các nút

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<abcd name="ab.catalog" xmlns="http://www.xyz.com/pqr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xyz.com/pqr ./abc.xyz.xsd">    
<efg> 
...... 
</efg> 
<efg> 
..... 
</efg> 
</abcd> 

sau đó,

List<Node>list = document.selectNodes("/abcd/efg"); 

nhận được kích thước của danh sách không. Tôi cảm thấy đó là do không gian tên được chỉ định trong xml. Tôi đã thử rất nhiều nhưng không thành công.

Trả lời

9

Tên phần tử không được cố định trong biểu thức XPath đề cập đến các phần tử không nằm trong không gian tên - chúng không tính đến không gian tên "mặc định" xmlns="..." được khai báo trên tài liệu. Bạn cần khai báo một tiền tố cho không gian tên trong công cụ XPath và sau đó sử dụng tiền tố đó trong biểu thức. Dưới đây là một ví dụ lấy cảm hứng từ the DOM4J javadocs:

Map uris = new HashMap(); 
uris.put("pqr", "http://www.xyz.com/pqr"); 
XPath xpath = document.createXPath("/pqr:abcd/pqr:efg"); 
xpath.setNamespaceURIs(uris); 
List<Node> nodes = xpath.selectNodes(document); 
+0

@ Ian: thanxs, nó hoạt động, nhưng tôi có một câu hỏi nếu tôi có để lấy một số nút hoặc nút nhiều giá trị hơn trong nút con đến nút con, sau đó tôi đã thử giống như được chỉ định ở trên như> cho (Nút nút: nút) { \t XPath xpath1 = document.createXPath ("// edx: Tên/giá trị-"); \t xpath1.setNamespaceURIs (uris); \t Tên nútNode = (Nút) xpath1.selectSingleNode (nút); \t} nhưng nó cung cấp cho nameNode null. làm thế nào để làm cho nó khả thi như dom4j. bất kỳ đầu vào sẽ được đánh giá cao. – user1808932

+0

@ user1808932 '// edx: Tên/giá trị-' là một đường dẫn _absolute_, sẽ bắt đầu tìm kiếm từ nút gốc của tài liệu chứa 'nút'. Nếu bạn muốn con trỏ 'edx: Name' của' nút' hiện tại thì bạn cần sử dụng đường dẫn tương đối '.// edx: Tên/giá trị-' (có dấu chấm đầu). –

-3

Sửa đổi mã của bạn:

List<Node>list = document.selectNodes("//abcd/efg"); 
+3

điều này không đúng. cú pháp '//' không liên quan gì đến các không gian tên –

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