2009-08-06 44 views

cevap

3

, bunu yapabilirsiniz:

element.getChildren("link"); 

standart Dom ile alabilirsiniz yakın (i (getChildNodes çağırarak) ve her öğeyi kontrol ederek (çocuk düğümleri listesini yineleme etmektir .) nodelist arasında adı eşleşen düğümleri seçmek dışarı

+0

JDOM hakkında düşündüm, ancak DOM ile çok fazla kod yazdım. Dönüştürme çabasına bakmalıyım. Ama bunu DOM ile yapmanın bir yolu yok mu? – user152090

+0

Bunu yapmak için uygun bir yol olduğunu düşünmüyorum. ancak, getChildNodes() çağrılarını alan, her öğenin adını kontrol eden, öğeleri yeni bir NodeList'e ekleyen ve ardından NodeList öğesini döndüren bir yöntem oluşturabilirsiniz. Adlandırılmış çocukları almak için ihtiyacınız olan her yerde bu yöntemi kullanın. Ya da mermiyi ısırıp JDom kullanın, uğraşmak çok daha kolay. –

+0

Teşekkür ederim. Önerilen farklı çözümlere bakacağım. Hızlı cevabınız için teşekkür ederim. – user152090

12

Sen XPath kullanabilirsiniz:

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

Hızlı yanıt için teşekkürler. – user152090

10

o e yapmak için herhangi bir yöntem bulamadık ither yüzden ben bu eski bir soru olduğunu biliyorum üst düzeyde

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 ""; 
} 
+0

Eğer if döngü her zaman doğrudur. ı ... Bu gibi güvenilir için (int nodeCnt = 0; nodeCnt

+1

) çocuk olmak üzere tüm unsurları içeren nodelist olduğunu. Bu cevap bana yardımcı oldu. Bu kodla başladım ve JS'ye dönüştürdüm. 'fonksiyonu getChildrenByTagName (ana, ad) { var nodelist = []; için (var çocuk = parent.firstChild;! çocuğa = null; çocuk = child.nextSibling) { \t if (child.nodeType == 1 && adı == child.nodeName) { nodeList.push (çocuk); } } dönüş nodelist; } ' – curioustechizen

+0

PHP fonksiyonu getChildrenByTagName ($ üst, $ isim) { $ nodelist = array(); foreach ($ ebeveyn> getElementsByTagName $ çocuk olarak ($ ​​isim)) { if ($ çocuk-> noteType == 1) { array_push ($ nodelist $, çocuk); } } dönüş $ nodeList; } – thethakuri

0

yazdım, ama yine de ben eklemek için alternatif bir çözüm.

En verimli değil, ama çalışır:

getElementsByTagName kullanarak tüm çocukların, o zaman sadece her bir sen ile başlayan birine aynı üst öğesi kontrol alın.

Bunu kullanıyorum çünkü bir sonuç kümem var, her sonuç içinde iç içe geçmiş sonuçlara sahip olabilir. Sonuç Oluşturucu'yu aradığımda iç içe geçmiş sonuçları eklemem gerekir, ancak kendileri kendi çocuklarını arayacakları için çocukları mevcut seviyeye eklemek istemiyorum (ebeveynleri onları ekleyecektir).

Örnek: Bu yardımcı olur

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

Umut.

1

için kısıtlamak, tagName tarafından düğüm değerini almak için bu fonksiyonu yazdım bu yardımcı işlevini,

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