2010-04-14 23 views
12

Tôi vừa nhận ra rằng phương thức Element.getElementsByTagName("someTagName") trả về một nút của tất cả các phần tử trong tài liệu có một thẻ tên đã cho. Nếu tôi chỉ muốn có được tất cả các yếu tố con bằng tên thẻ thì sao?API W3C DOM trong Java, nhận các phần tử con theo tên

Ví dụ ...

<person> 
    <name>Bob</name> 
    <car> 
    <name>Toyota Corolla</name> 
    </car> 
</person> 

Trả lời

3

getElementsByTagName luôn hoạt động trong ngữ cảnh của phần tử được gọi. Nếu được gọi là Element, chỉ các phần tử con của tên thẻ đã cho mới được truy cập. Tôi nghĩ bạn đang nhầm lẫn điều này với phương thức Document đối tượng (org.w3c.dom.Document) getElementsByTagName, khi đó tất cả các yếu tố theo tên thẻ đã cho trong tài liệu sẽ được trả lại.

+0

Đó là getElement ** s ** ByTagName. – stefanw

+0

Cảm ơn bạn đã chỉ ra nó – Fazal

+17

Tôi e là không đúng - phương thức này trả về các phần tử con cháu, ví dụ 'getElementsByTagName (" name ")' được thực hiện trên phần tử 'Element' đại diện cho người sẽ trả về 2 nút. –

1

Không phải tất cả các yếu tố trong tài liệu - tất cả hậu duệ yếu tố của phần tử nó được gọi vào. Nghe có vẻ như đó là những gì bạn muốn. Bạn chỉ cần gọi nó ở bên phải Element. Xem here.

2

Tôi gặp sự cố tương tự. Hãy thử nhìn vào lớp Node thay vì:

http://java.sun.com/javase/6/docs/api/org/w3c/dom/Node.html#getChildNodes()

Có một phương pháp gọi là "getChildNodes" mà trả về danh sách các tất cả nút con trực tiếp. Sau đó, bạn cần phải lọc danh sách đó để chỉ nhận được các nút phần tử với đúng tên thẻ.

16
public static Element getDirectChild(Element parent, String name) 
{ 
    for(Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) 
    { 
     if(child instanceof Element && name.equals(child.getNodeName())) return (Element) child; 
    } 
    return null; 
} 
+1

Trong trường hợp của tôi, tôi thấy hữu ích khi sửa đổi điều kiện nếu kiểm tra localName: if (child instanceof Element && (name.equals (child.getLocalName()) || name.equals (child.getNodeName()))) { – benvolioT

3

Có cùng vấn đề nhưng không có câu trả lời nào thực sự giải quyết được câu hỏi.

Tôi đang cố gắng truy vấn các nút Thao tác INSIDE nút portType Node của WSDL, cho rằng nút liên kết cũng có các thao tác.

<portType name="MyService"> 
    <operation name="op1"> 
     <input wsam:Action="http://somedomain.org/MyService/MyServiceRequest" message="tns:MyServiceRequest"/> 
     <output wsam:Action="http://somedomain.org/MyService/MyServiceResponse" message="tns:MyServiceResponse"/> 
    </operation> 
    ... 
</portType> 
<binding name="MyServicePortBinding" type="tns:MyService"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
    <operation name="op1"> 
     <soap:operation soapAction=""/> 
     <input> 
     <soap:body use="literal"/> 
     </input> 
     <output> 
     <soap:body use="literal"/> 
     </output> 
    </operation> 
</binding> 

Giải quyết bằng cách tìm cha mẹ (portTypes) và chỉ truyền từ nút này sang phần tử khác và sử dụng phương pháp có tên ở trên.

Node portType = document.getElementsByTagName("portType").item(0); 
NodeList operations = ((Element)portType).getElementsByTagName("operation"); 

Điều này đã cho tôi kết quả là các thành phần hoạt động chỉ INSIDE portType Node.

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