如何使用 Java 为 xml 中的元素获取第 N 个 parent
How to get Nth parent for an element in xml using Java
我正在使用 w3c dom 库来解析 XML。这里我需要第 3 个 parent 元素。例如在下面 XML 我正在使用 element.getParentNode()
输入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>
我有 Element eleItem= /item
并且必须到达 parent /weather
我正在这样做 :
(Element) eleItem.getParentNode().getParentNode().getParentNode();
是否有任何其他方法或使用 xpath
因为这似乎不是正确的方法?
像getXPathParent(eleItem, "../../..")
你快到了。您可以像下面这样使用 XPathFactory
of java :
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 级父元素。
evaluate
中的 XPathConstants.NODE
告诉 Java XPath 引擎将其检索为 Node
。
输出将是:
weather
编辑:
- 如果您有一个元素作为输入:
下面的代码应该给出第 3 个父元素,其中元素是 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;
}
我正在使用 w3c dom 库来解析 XML。这里我需要第 3 个 parent 元素。例如在下面 XML 我正在使用 element.getParentNode()
输入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>
我有 Element eleItem= /item
并且必须到达 parent /weather
我正在这样做 :
(Element) eleItem.getParentNode().getParentNode().getParentNode();
是否有任何其他方法或使用 xpath
因为这似乎不是正确的方法?
像getXPathParent(eleItem, "../../..")
你快到了。您可以像下面这样使用 XPathFactory
of java :
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 级父元素。
evaluate
中的 XPathConstants.NODE
告诉 Java XPath 引擎将其检索为 Node
。
输出将是:
weather
编辑: - 如果您有一个元素作为输入:
下面的代码应该给出第 3 个父元素,其中元素是 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;
}