2017-06-07 5 views
0

私はw3c domライブラリを使用してXMLを解析しています。私はelement.getParentNode()Javaを使用してXMLの要素のN番目の親を取得する方法

入力XML

<abc cd="1"> 
    <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0"> 
     <current_conditions> 
      <condition data="Clear"> 
       <item abc ="1" /> 
      </condition> 
      <temp_f data="49"/> 
      <temp_c data="9"/> 
     </current_conditions> 
    </weather> 
</abc> 

を使用しています下のXMLの例.FORここで私は私がElement eleItem= /itemを持っていると私のようにそれをやっている親/weatherに取得する必要があります要素の第三の親を必要とする:

(Element) eleItem.getParentNode().getParentNode().getParentNode(); 

xpathこれは正しい方法ではないようですので、他の方法がありますか? のようなものgetXPathParent(eleItem, "../../..")

答えて

1

あなたはほとんどそこにいます。あなたは、以下のようなJavaのXPathFactoryを使用することができますどのように動作

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder db = dbf.newDocumentBuilder(); 

Document doc = db.parse(new File("input.xml")); 

XPathFactory xPathFactory = XPathFactory.newInstance(); 
XPath xpath = xPathFactory.newXPath(); 

XPathExpression expr = xpath.compile ("//item/../../.."); 


Object exprValue = expr.evaluate(doc, XPathConstants.NODE); 

if (exprValue != null && exprValue instanceof Node) 
{ 
    Node weatherNode = (Node)exprValue; 

    System.out.println(weatherNode.getNodeName()); 
} 

xpath //item/../../..は、要素itemを再帰的に検索し、その第3レベルの親を取得します。

XPathConstants.NODEは、Java XPathエンジンにNodeとして取得するよう指示します。

出力は次のようになります。

weather

EDIT: - あなたが入力としての要素がある場合:

を次のコードは、要素がitemである第三の親を与える必要があります。

public Node getParentNodeUsingXPath(Element element) 
{ 
    Node parentNode = null; 
    XPathFactory xPathFactory = XPathFactory.newInstance(); 
    XPath xpath = xPathFactory.newXPath(); 

    String nodeName = element.getNodeName(); 

    String expression = "//" + nodeName + "/../../.."; 

    Object obj = xpath.evaluate(expression, element, XPathConstants.NODE); 
    if (obj != null) 
    { 
     parentNode = (Node)obj; 
    } 

    return parentNode; 
} 
+0

expr.evaluate(doc、XPathConstants.NODE);私の要件はElementアイテムに基づいていますが、ドキュメント全体でノードxpathを探しています。複数の 'weather'タグがあると想像してください。アイテム要素を使って、私はそのパラレントに到達することができます – 2FaceMan

+0

' item'タグを持たない 'weather'タグがあることを示唆していますか? 'weather'タグに' item'を付けるだけでいいのですか?最初に要素 'item'をどうやって取得していますか? – SomeDude

+0

これは、要素要素のリストを持つエキサイティングなコードです。アイテム要素からは、親weather要素が必要です。 – 2FaceMan

関連する問題