Java解析XML:getElementsByTagName返回所有元素

时间:2018-02-20 10:52:58

标签: java xml parsing dom nodelist

我有以下xml结构:

<node name="node1">
    <parameter name="param1" value="1" />
    <parameter name="param2" value="2" />
    <parameter name="param3" value="3" />

    <option name="opt1">
        <parameter name="opt1-p1" value="11" />
        <parameter name="opt1-p2" value="12"/>
        <parameter name="opt1-p3" value="13"/>
    </option>
</node>
... 

该文件包含多个具有多个选项的nodeElements。

使用语句getElementsByTagName

       ...
       Node nNode = nodeListSessions.item(nodeIndex);
       Element nodeElements = (Element) nNode;
       NodeList nodeListParameters = nodeElements .getElementsByTagName("parameter");
       ...  

它获取所有参数,包括选项inner-elements的参数。

如何在nodelist(nodeListParameters)中只接收node element?

的参数

2 个答案:

答案 0 :(得分:2)

一种选择是使用简单的XPath表达式:/node/parameter

这只会在根级节点元素中获得参数元素。您可以使用java.xml.xpath中提供的XPath类,如下所示:

XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("/node/parameter");

NodeList nodeListParameters = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

您需要将XML doc作为某种InputSource对象,例如org.w3c.dom.Document。有关详细信息,请参阅this answer

您可以玩游戏并测试不同的xpath查询here

答案 1 :(得分:0)

我发现一个简单的解决方案是检查父节点是“选项”还是“节点” e.g

if ((element.getNodeName() == "parameter") & (element.getParentNode().getNodeName()== "node")) {
... }

if ((element.getNodeName() == "parameter") & (element.getParentNode().getNodeName()== "option")) {
... }