2009-08-06 16 views
18

Mam plik XML w następujący sposób:JAVA element.getElementsByTagName Ogranicz do górnego poziomu

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

Kod XML Java za pomocą DOM przedstawia się następująco:

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

Będzie mi dać wszystkie z elementy "link", w tym najwyższy poziom i jeden wewnątrz węzła "image".

Czy istnieje sposób, aby po prostu uzyskać znaczniki "link" dla rootNode w ramach jednego poziomu, a nie dwa takie jak w przypadku łącza obrazu? To znaczy, chcę tylko link "http://rootlink/".

Odpowiedz

3

Jeśli można użyć JDOM zamiast, można to zrobić:

element.getChildren("link"); 

Przy standardowym Dom najbliżej można dostać się do iteracji listy węzłów potomnych (poprzez wywołanie getChildNodes() i sprawdzanie każdego elementu (i .) na liście węzłów, wybierając węzły o nazwie pasującej

+0

Myślałem o JDOM, ale napisałem dużo kodu z DOM. Muszę spojrzeć na poziom wysiłku, aby przekonwertować. Ale czy nie można tego zrobić za pomocą DOM? – user152090

+0

Nie sądzę, jest to wygodny sposób to zrobić. ale możesz utworzyć metodę, która pobiera wywołania getChildNodes(), sprawdza nazwę każdego elementu, dodaje elementy do nowej NodeList, a następnie zwraca NodeList. Użyj tej metody wszędzie tam, gdzie potrzebujesz uzyskać nazwane dzieci. Albo ugryź bullet i używaj JDom, z którym dużo łatwiej się uporać. –

+0

Dziękuję. Przyjrzę się różnym proponowanym rozwiązaniom. Dziękuję za szybką odpowiedź. – user152090

12

można użyć XPath:

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

Dzięki za szybką odpowiedź. – user152090

10

nie mogłem znaleźć żadnych sposobów, aby to zrobić e ither więc napisałem tę funkcję pomocnika,

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

Pętla if ma zawsze wartość true. Próbowałem tak ... for (int nodeCnt = 0; nodeCnt

+1

wylądowałem tutaj szuka sposobu, aby to zrobić w JavaScript. Ta odpowiedź pomogła mi. Zacząłem od tego kodu i przekształciłem go w JS. 'funkcja getChildrenByTagName (rodzic, nazwa) { var nodeList = []; dla dzieci (var = parent.firstChild!; Dziecka = NULL, dziecko = child.nextSibling) { \t if (child.nodeType == 1 && nazwa == child.nodeName) { nodeList.push (dziećmi); } } return nodeList; } ' – curioustechizen

+0

PHP: function getChildrenByTagName ($ parent, $ name) { $ nodeList = array(); foreach ($ parent-> getElementsByTagName ($ name) jako $ child) { if ($ child-> nodeType == 1) { array_push ($ nodeList, $ child); } } } return $ nodeList; } – thethakuri

0

Napisałem tę funkcję, aby uzyskać wartość węzła według zmiennej, ograniczają się do najwyższego poziomu

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

wiem, że to jest stare pytanie, ale mimo wszystko mam alternatywne rozwiązanie do dodania.

To nie jest najbardziej skuteczny, ale działa:

Uzyskaj wszystkie dzieci korzystających getElementsByTagName, a potem po prostu sprawdzić każdy ma tego samego rodzica do jednego z nich na początku.

Używam tego, ponieważ mam zestaw wyników, każdy wynik może zawierać wyniki w nim zagnieżdżone. Kiedy wywołuję mój konstruktor wyników, muszę dodać jakiekolwiek zagnieżdżone wyniki, ale ponieważ oni sami będą szukać własnych dzieci, nie chcę dodawać dzieci do bieżącego poziomu (ich rodzic doda je).

przykład:

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))); 
    } 
} 

nadzieja pomaga.

Powiązane problemy