如何检查NodeList是否包含任何子节点?

时间:2017-08-21 19:03:01

标签: java xml xpath nodelist

是否有一种简单易行的方法来检查我从xpath评估的NodeList是否实际包含任何子节点,或者它是否只是空标签? 以这个简单的xml为例:

<shop>
  <shoes>brand1</shoes>
  <tshirt>brand2</tshirt>
  <socks>brand3</socks>
</shop>

如果我跑

 NodeList nodeList = (NodeList) path.evaluate("/shop", myDocument, XPathConstants.NODESET);

我会得到一个很好的NodeList,我可以从中提取各种鞋子,T恤和袜子的价值。没关系。但是,如果我有一个看起来像这样的xml:

<shop>
</shop>

运行相同的命令会给我一个长度为1的NodeList,如果我已经知道它什么都不包含,我宁愿不继续提取过程。

除了检查是否nodeList.item(0).getChildNodes().getLength() == 1之外,还有其他方法可以检查空的childNodes吗?

1 个答案:

答案 0 :(得分:0)

您可以使用"/shop/*" xpath和getLength()方法进行检查。像这样:

    public static void main(String[] args)
            throws XPathExpressionException, ParserConfigurationException, SAXException, IOException {

        String myDocumentStr = "<shop><shoes>brand1</shoes><tshirt>brand2</tshirt><socks>brand3</socks></shop>";
        Node myDocument = getNode(myDocumentStr);

        XPathExpression path = XPathFactory.newInstance().newXPath().compile("/shop/*");

        NodeList nodeList = (NodeList) path.evaluate(myDocument, XPathConstants.NODESET);

        System.out.println(nodeList.getLength());

        myDocumentStr = "<shop></shop>";
        myDocument = getNode(myDocumentStr);
        nodeList = (NodeList) path.evaluate(myDocument, XPathConstants.NODESET);

        System.out.println(nodeList.getLength());
    }

    private static Node getNode(String myDocumentStr) throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();

        Node myDocument = builder.parse(new ByteArrayInputStream(myDocumentStr.getBytes()));
        return myDocument;
    }

输出:

3
0