当xpath部分已知时,获取xml文件中的节点列表

时间:2016-11-18 12:48:33

标签: java xml dom xpath

我有这个xml文件:

<root>
    <products>
        <id>1</id>
        <name>newProduct</name>
    </products>
    <cars>
        <car>
            <id>qw123</id>
            <color>red</color>
        </car>
        <car>
            <id>AS6789</id>
            <color>blue</color>
        </car>
    </cars>
</root>

我需要在列表中提取所有带有标签&#34; id&#34;的元素。它们包含在标签&#34; cars&#34;中,使用Java方法。我创建的方法是:

    private static List<Node> searchNodes(Document doc, String nodeName, String tag) {

    Node mainNode = doc.getElementsByTagName(tag).item(0);  
    List<Node> result = new ArrayList<Node>();

    NodeList list = mainNode.getChildNodes();
    for (int i = 0; i < list.getLength(); i++) {
        Node node = list.item(i);
        if (node.getNodeName().equals(nodeName)) {
            result.add(node);
        }
    }
    return result;
}

只有在&#34; id&#34;是&#34;汽车&#34;的直接孩子。因此,在这种情况下,如果&#34;标记&#34;是&#34;产品&#34;。

1 个答案:

答案 0 :(得分:0)

实测值。我不确定它是否是最好的解决方案,但至少它起作用了:

    private static List<Node> searchNodes(Document doc, String nodeName, String tag) {
    Node mainNode = doc.getElementsByTagName(tag).item(0);  
    List<Node> result = new ArrayList<Node>(); 

    NodeList list = mainNode.getChildNodes();
    for (int i = 0; i < list.getLength(); i++) {
        Node node = list.item(i);
        if (node.getNodeName().equals(nodeName)) {
            result.add(node);
        } else {
            result.addAll(getChilds(node, nodeName));
        }
    }
    return result;      
}

private static List<Node> getChilds(Node node, String nodeName) {
    NodeList list = node.getChildNodes();
    List<Node> result = new ArrayList<Node>(); 
    for (int i = 0; i < list.getLength(); i++) {
        if (list.item(i).getNodeName().equals(nodeName)) {
            result.add(list.item(i));
        }
    }
    return result;
}