我有以下XML结构:
<map name="testmap">
<definitions>
<tile name="ground"> <!-- a normal tile that has no special obstacles -->
<centralObstacle>ground</centralObstacle>
<neighbourObstacles>
<north></north>
<east></east>
<south></south>
<west></west>
</neighbourObstacles>
</tile>
<tile name="wallE"> <!-- a ground tile with a wall obstacle at the east-->
<centralObstacle>ground</centralObstacle>
<neighbourObstacles>
<north></north>
<east>wall</east>
<south></south>
<west></west>
</neighbourObstacles>
</tile>
</definitions>
</map>
我想用XPATH查询它。我想要做的是获取所有磁贴节点,然后迭代它们以获取所有名称和其他相关信息(使用不同的XPATH查询)。
因为XPATH表达式要在Document上运行,所以我使用了this中提供的nodeListToDoc()
函数来将XPATH查询(NodeList)的结果转换为Document。通过这种方式,我可以先获取所有Tiles,然后迭代它们以获取Tile特定信息。
private Document nodeListToDoc(NodeList nodes) throws ParserConfigurationException
{
Document newXmlDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element root = newXmlDocument.createElement("root");
newXmlDocument.appendChild(root);
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
Node copyNode = newXmlDocument.importNode(node, true);
root.appendChild(copyNode);
}
return newXmlDocument;
}
我首先要做的是将文件解析为Document,然后运行查询以获取包含所有Tiles的NodeList。当我运行查询//definitions/tile
时,我得到一个包含两个Node项的NodeList(我已经验证了这一点),这是正确的。应用nodeListToDoc()
的结果如下所示。
<?xml version="1.0" encoding="UTF-16"?>
<root><tile name="ground"> <!-- a normal tile that has no special obstacles -->
<centralObstacle>ground</centralObstacle>
<neighbourObstacles>
<north/>
<east/>
<south/>
<west/>
</neighbourObstacles>
</tile><tile name="wallE"> <!-- a ground tile with a wall obstacle at the east-->
<centralObstacle>ground</centralObstacle>
<neighbourObstacles>
<north/>
<east>wall</east>
<south/>
<west/>
</neighbourObstacles>
</tile></root>
到目前为止一切顺利。现在事情变坏了。我想迭代这两个节点,制作它们的NodeList,将该NodeList转换为Document,然后对它们运行一些查询。其中一个查询是获取每个磁贴的名称。我认为以下代码片段可以解决这个问题:
for (int i = 0; i < nodes.getLength(); i++) { // iterate over the two nodes
NodeList tile = (NodeList) nodes.item(i); // create a nodelist containing only the first node
Document attrdoc = nodeListToDoc(tile); // convert it to a document
}
但是,当我打印attrdoc表示的结果树时,我在第一次迭代时得到以下结果:
<?xml version="1.0" encoding="UTF-16"?>
<root> <!-- a normal tile that has no special obstacles -->
<centralObstacle>ground</centralObstacle>
<neighbourObstacles>
<north/>
<east/>
<south/>
<west/>
</neighbourObstacles>
</root>
这是不正确的。根元素的子元素应该是tile吗?这个元素去了哪里?
答案 0 :(得分:1)
你并没有真正解释你想要实现的目标,但你的描述确实让我想知道Java + XPath是否适合这项工作。你有没有看过在XQuery或XSLT中做到这一点?
答案 1 :(得分:0)
+1 @ Andy的评论。当我读到你的问题时,我觉得你真的不想写一个新文件;相反,您只是将其用作从现有XML中提取信息的手段。
因此,您的方法是直接从节点访问信息。例如,在迭代两个节点的段落中,您可以执行以下操作:
for (int i = 0; i < nodes.getLength(); i++) { // iterate over the two nodes
NodeList node = nodes.item(i);
if (node.getNodeType() == ELEMENT_NODE) {
Element element = (Element) node;
//from here, you can access element.getNodeValue(), element.getChildNodes(), etc.
}
}
此外,您可以返回newXmlDocument
并对其应用多个XPath查询。它不是一劳永逸的,就像你使用SAX解析器一样。