再帰メソッドを使用して、XMLファイルのトピック(ヘルプ&マニュアル以外のもの)を1つずつ読み込もうとしています。再帰メソッドを使用してXMLからノードを取得する(Javaの場合)
残念ながら、プログラマーは私が(何も印刷しない)したいと思っているようなトピックを印刷せず、stackoverflowに詰まってしまうので、間違いがあるようです。 私はそれを見つけることはできません..
私は助けていただきありがとうございます!
EDIT:私はデバッグでいくつかの時間を費やしましたが、再帰そのもの以外の問題の1つは、topicref(それは属性)の間違った「ノード」を読み取っていることです。私はそれをキャプションを読むようにする方法を知らない。 +それは1つのtopicrefを作成するだけで、それは実行されません。
コード:
package org.joox;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XPathDemo {
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
Document doc = null;
public static void main(String[] args) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder;
Document doc = null;
try {
builder = factory.newDocumentBuilder();
doc = builder.parse("table_of_contents.xml");
GiveCaption(doc.getChildNodes().item(0));
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}
private static void GiveCaption(Node n) {
// no child nodes + no caption -> end
if (!n.hasChildNodes() && !n.getNodeName().equals("caption")) {
return;
}
NodeList nodes = n.getChildNodes();
if (n.getChildNodes().getLength() == 0)
{
return;
}
if (n.getNodeName().equals("topicref")) {
if (n.getNodeName().equals("caption")) {
System.out.println(n);
}
}
for (int i = 0; i < nodes.getLength(); i++) {
n = nodes.item(i);
}
for (int i = 0; i < nodes.getLength(); i++) {
GiveCaption(n);
}
}
}
XML:
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns:xsi="http://www.w3.org/2001/XInclude">
<topicref type="topic" id="429303521027079" build="ALL" modified="2017-07-14T10:50:14.916Z" icon="0" href="Introduction">
<caption translate="true">Introduction</caption>
<topicref type="topic" id="429305694503733" build="ALL" modified="2017-07-14T10:50:15.258Z" icon="0" href="Welcome-topic">
<caption translate="true">Welcome topic</caption>
</topicref>
<topicref type="topic" id="42930890558253" build="ALL" modified="2017-07-14T10:50:15.479Z" icon="0" href="Second-topic">
<caption translate="true">Second topic</caption>
</topicref>
</topicref>
<topicref type="topic" id="429303877549160" build="ALL" modified="2017-07-14T10:50:15.711Z" icon="0" href="Chapter-2">
<caption translate="true">Chapter 2</caption>
<topicref type="topic" id="429304160418503" build="ALL" modified="2017-07-14T10:50:15.937Z" icon="0" href="Overview">
<caption translate="true">Overview</caption>
</topicref>
<topicref type="topic" id="429304436298052" build="ALL" modified="2017-07-14T10:50:16.168Z" icon="0" href="Sub-chapter-2_1">
<caption translate="true">Sub chapter 2.1</caption>
<topicref type="topic" id="429302637318652" build="ALL" modified="2017-07-14T10:50:16.395Z" icon="0" href="New-topic">
<caption translate="true">New topic</caption>
</topicref>
</topicref>
</topicref>
</map>
[最小限で完全で検証可能な例](http://stackoverflow.com/help/mcve)の精神で、無関係なコードをすべて削除してください。 – kazemakase
完了。私は新しいです申し訳ありません:) – Raphael
技術を変更する場合は、XPathを使用してください。すべてのキャプションノードを取得するには、 '//caption'を使うだけです。 – beat