2009-08-06 19 views
18

を制限:次のようにDOMを使用してJAVA element.getElementsByTagNameは、次のように私は、XMLファイルを持っているトップレベルに

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

XML Javaコードは次のとおりです。

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

これは私のすべてを与えますトップレベルを含む "リンク"要素と "イメージ"ノード内の要素。

イメージリンクの場合のように、2つではなく1つのレベル内でrootNodeの「リンク」タグを取得する方法はありますか?つまり、私はちょうどhttp://rootlink/ "リンク"が欲しいです。

答えて

3

あなたの代わりにJDOMを使用することができる場合は、あなたがこれを行うことができます:

element.getChildren("link"); 

標準ドムでは、あなたが得ることができる最も近い)(GETCHILDNODESを呼び出すことによって、(子ノードのリストを反復することで、各項目をチェックし(I 。)のNodeListの、一致する名前を持つノードを選び出す

+0

私はJDOMについて考えましたが、DOMで多くのコードを書いています。私は変換する努力のレベルを見なければならない。しかし、DOMでそれを行う方法はありませんか? – user152090

+0

私はそれを行う便利な方法はないと思います。 getChildNodes()を呼び出すメソッドを作成し、各アイテムの名前を確認し、アイテムを新しいNodeListに追加してから、NodeListを返します。名前付きの子を取得する必要がある場合は、そのメソッドを使用します。または、弾丸を噛んでJDomを使用すると、対処がずっと楽になります。 –

+0

ありがとうございます。私は、提案されているさまざまなソリューションを検討します。早速のご返事ありがとうございます。 – user152090

12

あなたはXPath使用することができます

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

迅速な対応に感謝します。 – user152090

10

を私はその電子を行うための任意の方法を見つけることができませんでしたitherので、私はこれが古い質問ですけど、それにもかかわらず、私が持っているトップレベルに

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

ifループは常にtrueです。私はこのようにしました... (int nodeCnt = 0; nodeCnt

+1

私はここでJavascriptでこれを行う方法を探していました。この回答は私を助けました。私はこのコードを使い、それをJSに変換しました。 関数getChildrenByTagName(親、名前){ var nodeList = []; for(var child = parent.firstChild; child!= null; child = child.nextSibling){ \t if(child.nodeType == 1 && name == child.nodeName){ nodeList.push(child); } } return nodeList; } ' – curioustechizen

+0

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

0

をこのヘルパー関数を書きました追加する代替ソリューション。

それが最も効率的ではないが、動作します:

getElementsByTagNameのを使用して、すべての子どもたちは、その後、ちょうどそれぞれがあなたが開始したものと同じ親を持つチェックしなさい。

私は結果のセットを持っているので、これを使用します。それぞれの結果は、その中にネストされた結果を持つことができます。 Resultコンストラクタを呼び出すと、ネストされた結果を追加する必要がありますが、自分自身の子を探すので、現在のレベルに子を追加したくない(親が追加します)。

例:

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

・ホープ、このことができます。

1

を制限し、私はtagNameをして、ノードの値を取得するには、この機能を書いて、

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; 
    } 
関連する問題