2017-06-07 3 views
0

J'utilise w3c dom library pour analyser XML. Ici, je dois 3ème parent de l'élément .Par exemple en XML ci-dessous J'utilise element.getParentNode()Comment obtenir le Nième parent pour un élément en XML en utilisant Java

XML Entrée

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

je Element eleItem= /item et doivent se rendre à des parents /weather que je fais comme:

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

Y at-il une autre méthode ou en utilisant xpath comme cela ne semble pas être la bonne façon? quelque chose comme getXPathParent(eleItem, "../../..")

Répondre

1

Vous y êtes presque. Vous pouvez utiliser XPathFactory de java comme ci-dessous:

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

Comment ça marche? Le xpath //item/../../.. recherche récursivement l'élément item et obtient son parent de troisième niveau. Le XPathConstants.NODE dans le evaluate indique au moteur Java XPath de le récupérer en tant que .

sortie sera:

weather

EDIT: - Si vous avez un élément en entrée:

Le code suivant devrait donner au 3ème parent, où l'élément est 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); cherche le noeud xpath dans doc entier, alors que mon exigence est basée sur élément élément. Imaginez qu'il y ait plusieurs balises 'weather', en utilisant l'élément item je peux accéder à son parrent – 2FaceMan

+0

Donc vous suggérez qu'il y a des balises' weather' qui n'ont pas de balises 'item'? et vous voulez seulement les balises 'weather' qui ont' item's? Comment obtenez-vous l'Element 'item' en première place? – SomeDude

+0

ceci est un code passionnant qui a une liste d'éléments d'élément .. de l'élément d'élément j'ai besoin de son élément de temps parent. – 2FaceMan