2009-08-06 1 views
18

Tôi có một file XML như sau:JAVA element.getElementsByTagName Restrict để Top Level

<rootNode> 
    <link>http://rootlink/</link> 
    <image> 
     <link>http://imagelink/</link> 
     <title>This is the title</title> 
    </image> 
</rootNode> 

Mã Java XML sử dụng DOM được như sau:

NodeList rootNodeList = element.getElementsByTagName("link"); 

này sẽ cho tôi tất cả các các yếu tố "liên kết" bao gồm cấp cao nhất và phần tử bên trong nút "hình ảnh".

Có cách nào để chỉ nhận thẻ "liên kết" cho rootNode trong một cấp và không phải hai thẻ chẳng hạn như trường hợp của liên kết hình ảnh không? Đó là, tôi chỉ muốn liên kết "http://rootlink/".

Trả lời

3

Nếu bạn có thể sử dụng JDOM thay vào đó, bạn có thể làm điều này:

element.getChildren("link"); 

Với tiêu chuẩn Dom gần nhất bạn có thể nhận được là để lặp danh sách các nút con (bằng cách gọi getChildNodes() và kiểm tra từng hạng mục (i .) của NodeList, chọn ra các nút với tên phù hợp

+0

Tôi đã nghĩ về JDOM, nhưng tôi đã viết rất nhiều mã với DOM. Tôi phải nhìn vào mức độ nỗ lực để chuyển đổi. Nhưng không có cách nào để làm điều đó với DOM? – user152090

+0

Tôi không nghĩ rằng có một cách thuận tiện để làm điều đó. nhưng bạn có thể tạo một phương thức nhận các cuộc gọi getChildNodes(), kiểm tra tên của mỗi mục, thêm các mục vào một NodeList mới, sau đó trả về NodeList. Sử dụng phương pháp đó bất cứ nơi nào bạn cần để có được trẻ em được đặt tên. Hoặc cắn viên đạn và sử dụng JDom, tôi thấy nó dễ dàng hơn nhiều để giải quyết. –

+0

Cảm ơn bạn. Tôi sẽ xem xét các giải pháp khác nhau được đề xuất. Cảm ơn đã phản ứng nhanh chóng. – user152090

12

Bạn có thể sử dụng XPath:

XPathFactory xpathFactory = XPathFactory.newInstance(); 
XPath xpath = xpathFactory.newXPath(); 
NodeList links = (NodeList) xpath.evaluate("rootNode/link", element, 
    XPathConstants.NODESET); 
+0

Cảm ơn bạn đã phản hồi nhanh. – user152090

10

tôi không thể tìm thấy bất kỳ phương pháp để làm điều đó e ither vì vậy tôi đã viết chức năng helper này,

public static List<Element> getChildrenByTagName(Element parent, String name) { 
    List<Element> nodeList = new ArrayList<Element>(); 
    for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) { 
     if (child.getNodeType() == Node.ELEMENT_NODE && 
      name.equals(child.getNodeName())) { 
     nodeList.add((Element) child); 
     } 
    } 

    return nodeList; 
    } 
+0

Vòng lặp if luôn đúng. tôi đã thử như thế này ... cho (int nodeCnt = 0; nodeCnt

+1

Tôi đã hạ cánh ở đây tìm cách để làm điều này trong Javascript. Câu trả lời này đã giúp tôi. Tôi bắt đầu với mã này và biến nó thành JS. 'function getChildrenByTagName (tên cha, mẹ) { var nodeList = []; cho (var child = parent.firstChild; child! = Null; child = child.nextSibling) { \t if (child.nodeType == 1 && name == child.nodeName) { nodeList.push (con); } } nút quay lạiDanh sách; } ' – curioustechizen

+0

PHP: hàm getChildrenByTagName ($ parent, $ name) { $ nodeList = array(); foreach ($ parent-> getElementsByTagName ($ name) là $ child) { nếu ($ child-> nodeType == 1) { array_push ($ nodeList, $ child); } } trả về $ nodeList; } – thethakuri

0

tôi đã viết chức năng này để có được giá trị nút bởi TagName, hạn chế để đầu mức

public static String getValue(Element item, String tagToGet, String parentTagName) { 
    NodeList n = item.getElementsByTagName(tagToGet); 
    Node nodeToGet = null; 
    for (int i = 0; i<n.getLength(); i++) { 
     if (n.item(i).getParentNode().getNodeName().equalsIgnoreCase(parentTagName)) { 
      nodeToGet = n.item(i); 
     } 
    } 
    return getElementValue(nodeToGet); 
} 

public final static String getElementValue(Node elem) { 
    Node child; 
    if (elem != null) { 
     if (elem.hasChildNodes()) { 
      for (child = elem.getFirstChild(); child != null; child = child 
        .getNextSibling()) { 
       if (child.getNodeType() == Node.TEXT_NODE) { 
        return child.getNodeValue(); 
       } 
      } 
     } 
    } 
    return ""; 
} 
1

Tôi biết đây là một câu hỏi cũ, nhưng dù sao tôi có một giải pháp thay thế để thêm vào.

Nó không phải là hiệu quả nhất, nhưng hoạt động:

Nhận tất cả các trẻ em sử dụng getElementsByTagName, sau đó chỉ cần kiểm tra từng ai có cha mẹ cùng với một bạn bắt đầu với.

Tôi sử dụng điều này vì tôi có một tập hợp các kết quả, mỗi kết quả có thể có kết quả được lồng bên trong nó. Khi tôi gọi hàm dựng kết quả của mình, tôi cần phải thêm bất kỳ kết quả lồng nhau nào, nhưng vì chính chúng sẽ tìm kiếm con riêng của chúng, tôi không muốn thêm con vào mức hiện tại (cha mẹ của chúng sẽ thêm chúng).

Ví dụ:

NodeList children = resultNode.getElementsByTagName("result"); 
for(int i = 0; i<children.getLength(); i++){ 
    // make sure not to pick up grandchildren. 
    if(children.item(i).getParentNode().isSameNode(resultNode)){ 
     addChildResult(new Result((Element)children.item(i))); 
    } 
} 

Hope this helps.