私は次の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式はドキュメントで実行されるため、このnodeListToDoc()
回答で提供されている次の関数を使用して、XPATHクエリ(NodeList)の結果をドキュメントに変換しました。このようにして、最初にすべてのタイルを取得し、次にそれらを反復処理してタイル固有の情報を取得できます。
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;
}
私が最初に行うことは、ファイルをドキュメントに解析してから、クエリを実行して、すべてのタイルを含むNodeListを取得することです。クエリを実行すると、//definitions/tile
2つのノードアイテムを含む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>
ここまでは順調ですね。今、事態は悪化します。2つのノードを反復処理し、それらのNodeListを作成し、そのNodeListをドキュメントに変換してから、いくつかのクエリを実行します。クエリの1つは、すべてのタイルの名前を取得することです。次のコードピースでうまくいくと思いました。
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>
これは正しくありません。ルート要素の子はタイルである必要がありますか?この要素はどこに行きましたか?