2011-01-14 11 views
16

Vì vậy, tôi có một doc xml mà tôi đã tuyên bố ở đây:Tìm các yếu tố trong một Node mà không có không gian tên thích hợp, trong Java

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); 
StringReader reader = new StringReader(s); 
InputSource inputSource = new InputSource(reader); 
doc_ = dBuilder.parse(inputSource); 

Sau đó, tôi có một chức năng mà tôi vượt qua trong một chuỗi và tôi muốn phù hợp mà một phần tử trong xml của tôi:

void foo(String str) 
{ 
    NodeList nodelist = doc_.getDocumentElement().getElementsByTagName(str); 
} 

vấn đề là khi str đi kèm trong nó không có bất kỳ loại namespace trong nó để xml rằng tôi sẽ thử nghiệm sẽ là:

<Random> 
    <tns:node /> 
</Random> 

str sẽ là nút. Vì vậy, nodelist bây giờ là null vì tns mong đợi của nó: nút nhưng tôi đã thông qua trong nút. Và tôi biết nó không tốt để bỏ qua không gian tên nhưng trong trường hợp này nó là tốt. Vấn đề của tôi là tôi không biết cách tìm kiếm Node cho một phần tử trong khi bỏ qua không gian tên. Tôi cũng nghĩ về việc thêm không gian tên vào str mà đi vào nhưng tôi không có ý tưởng làm thế nào để làm điều đó hoặc.

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều,

Cảm ơn, -Josh

Trả lời

26

Để phù hợp với tất cả các nút có tên là 'str' bất kể việc sử dụng không gian tên như sau:

NodeList nodes = doc.getDocumentElement().getElementsByTagNameNS("*", str); 

Ký tự đại diện "*" sẽ khớp với bất kỳ vùng tên nào. Xem Element.getElementsByTagNameNS(...).

Chỉnh sửa: ngoài ra, cách @Wheezil tuyên bố chính xác trong nhận xét, bạn phải gọi DocumentBuilderFactory.setNamespaceAware(true) để làm việc này, nếu không không gian tên sẽ không được phát hiện.

+0

Cảm ơn bạn rất nhiều vì một câu trả lời tuyệt vời khác RD01. – Grammin

+0

@gramm no problem :) –

+2

Điều đó dường như chỉ hoạt động đối với các đối tượng 'DocumentBuilderFactory'' không gian tên ', vì các phần tử DOM cấp 1 không có 'localName' ... –

2

Giải pháp đơn giản nhất là thêm nút gốc của mình thông qua thao tác chuỗi

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); 
s = "<root xmlns:tns=\"MyNamespace\">" + s + "</root>"; 
StringReader reader = new StringReader(s); 
InputSource inputSource = new InputSource(reader); 
doc_ = dBuilder.parse(inputSource); 
+0

Chuỗi đã có không gian tên trên đó, tôi cần chuỗi mà tôi thêm vào phương thức cần nhận ra không gian tên đó. – Grammin

+0

Bạn có thể đăng một ví dụ tối thiểu về xml đầy đủ mà bạn đang cố gắng xử lý hay không. Ví dụ xml bạn đã đăng đang sử dụng không gian tên không được khai báo ở bất kỳ đâu. Không gian tên tns cần phải được ánh xạ tới một URL cho tài liệu XML được định dạng tốt (xem http://en.wikipedia.org/wiki/XML_namespace#Namespace_declaration). –

+0

Cảm ơn bạn đã cố gắng giúp +1 nhưng câu trả lời của RD01 là những gì tôi đang tìm kiếm. – Grammin