Java:解析可能不存在的XML子元素

时间:2015-07-03 08:51:36

标签: java xml

我正在尝试从包含XML数据的InputStream中提取值。一般数据布局是这样的:

<objects count="1">
    <object>
        <stuff>...</stuff>
        <more_stuff>...</more_stuff>
        ...
        <connections>
            <connection>124</connection>
            <connection>128</connection>
        </connections>
    </object>
<objects>

我需要找到存储在<connection>属性中的整数。但是,我不能保证总会有两个(可能只有一个或根本没有)。更有甚者,会出现元素<connections>不存在的情况。

我一直在查看像this这样的示例,但它没有提到如何处理父项不存在的情况。

根本不存在<connections>的情况非常罕见(但是当它确实发生时我肯定需要知道它),以及它确实存在但包含少于两个{{1}的情况会更加罕见(基本上我希望它永远不会发生)。

我是否应该假设所有事情都已到位并在发生事情时捕获异常,或者是否有一种聪明的方法来检测是否存在<connection>

我最初的想法是使用类似的东西:

<connections>

根据上面链接的示例,这应该处理具有不同InputStream response = urlConnection.getInputStream(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(response); String xPathExpressionString = "/objects/object/connections/connection"; XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xPath = xPathFactory.newXPath(); XPathExpression expr = xPath.compile(xPathExpressionString); NodeList nodeList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); for (int i = 0; i < nodeList.getLength(); i++) { Node intersectionNode = nodeList.item(i); if (intersectionNode.getNodeType() == Node.ELEMENT_NODE) { // What is this anyway? // Do something with value } } 量的情况,但我应该如何处理<connection>丢失alltoghether。

(顺便说一下,应该总是只有一个<connections>,所以不必担心这个)

2 个答案:

答案 0 :(得分:1)

使用此xpath表达式:

   "//object//connection"

“//”构造是“自我或后代”轴的简短形式。因此,上面的表达式将选择具有<connection>父级的所有<object>元素。

答案 1 :(得分:0)

从下面的代码我们可以获得文档子标记的所有名称,一旦我们进入第二个if块,就意味着存在作为给定文档的childnode的连接标记:
正如您所说,我们不知道有关父母的信息,我们可以根据当前的xml使用以下行 group.getChildNodes()。项(0).getChildNodes()......

Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
NodeList groupList = doc.getChildNodes().item(0).getChildNodes();
for (int groupCount = 0; groupCount < groupList.getLength(); groupCount++)
 {
            Node group = groupList.item(groupCount);
            if (group.getNodeType() == Node.ELEMENT_NODE)
              {
                    if(group.getNodeName().equals("connections"))
                      {
                      }  
              }
}

我在Stackoverflow中的第一个答案。希望这有帮助。