我正在尝试从包含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>
,所以不必担心这个)
答案 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中的第一个答案。希望这有帮助。