通过递归方法从XML中获取节点(在Java中)

通过递归方法从XML中获取节点(在Java中),java,xml,eclipse,recursion,nodes,Java,Xml,Eclipse,Recursion,Nodes,我正在尝试使用递归方法逐个读取XML文件的主题(在帮助和手册中) 不幸的是,似乎有一些错误,因为程序没有像我想要的那样打印出主题(它什么也不打印),并且陷入了stackoverflow。 不过我没找到 我将感谢任何帮助 编辑:我花了一些时间进行调试,除了递归本身,还有一个问题就是它为topicref(它的属性)读取了错误的“节点”。但是我不知道怎么把它读出来。。 +它不运行类似的操作,因为它只创建1个topicref 代码: package org.joox; 导入java.io.IOExcep

我正在尝试使用递归方法逐个读取XML文件的主题(在帮助和手册中)

不幸的是,似乎有一些错误,因为程序没有像我想要的那样打印出主题(它什么也不打印),并且陷入了stackoverflow。 不过我没找到

我将感谢任何帮助

编辑:我花了一些时间进行调试,除了递归本身,还有一个问题就是它为topicref(它的属性)读取了错误的“节点”。但是我不知道怎么把它读出来。。 +它不运行类似的操作,因为它只创建1个topicref

代码:

package org.joox;
导入java.io.IOException;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入org.w3c.dom.Document;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
导入org.xml.sax.SAXException;
公共类XPathDemo{
DocumentBuilderFactory工厂=
DocumentBuilderFactory.newInstance();
文档生成器;
单据单据=空;
公共静态void main(字符串[]args){
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
文档生成器;
单据单据=空;
试一试{
builder=factory.newDocumentBuilder();
doc=builder.parse(“table_of_contents.xml”);
GiveCaption(doc.getChildNodes().item(0));
}捕获(ParserConfiguration异常| SAXException | IOE异常){
e、 printStackTrace();
}
}
专用静态标题(节点n){
//无子节点+无标题->结束
如果(!n.hasChildNodes()&&!n.getNodeName().equals(“标题”)){
返回;
}
NodeList nodes=n.getChildNodes();
如果(n.getChildNodes().getLength()==0)
{
返回;
}
if(n.getNodeName().equals(“topicref”)){
if(n.getNodeName().equals(“标题”)){
系统输出println(n);
}
}
对于(int i=0;i
XML:


介绍
欢迎话题
第二个话题
第二章
概述
第2.1分章
新话题

我知道这并不能直接回答您的问题,但您可以省去很多麻烦,立即开始使用JAXB。

JAXB是定义如何转换Java对象的Java标准 从和到XML。它使用一组标准映射

JAXB可能不适合的唯一原因是,您正在读取非常大的XML文件,并且希望动态地流式传输内容和读取+过程

即使在这种情况下,STAX(较新的javaxml库)也比SAX更易于使用。

代码看起来像是您从以前的实验中得到了一些位,这些位扰乱了操作的一般流程。此代码与原始代码之间的主要更改是删除GiveCaption方法中的某些元素。顺便说一句,由于标准命名约定的方法以小写开头,我也做了相应的更改:

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 {

    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) {
        NodeList nodes = n.getChildNodes();

        if (n.getNodeName().equals("caption")) {
            System.out.println(n.getFirstChild().getNodeValue());
        }

        for (int i = 0; i < nodes.getLength(); i++) {
            giveCaption(nodes.item(i));
        }
    }
}
import java.io.IOException;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入org.w3c.dom.Document;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
导入org.xml.sax.SAXException;
公共类XPathDemo{
公共静态void main(字符串[]args){
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
文档生成器;
单据单据=空;
试一试{
builder=factory.newDocumentBuilder();
doc=builder.parse(“table_of_contents.xml”);
giveCaption(doc.getChildNodes().item(0));
}捕获(ParserConfiguration异常| SAXException | IOE异常){
e、 printStackTrace();
}
}
专用静态标题(节点n){
NodeList nodes=n.getChildNodes();
if(n.getNodeName().equals(“标题”)){
System.out.println(n.getFirstChild().getNodeValue());
}
对于(int i=0;i
这将产生以下输出:

引言
欢迎话题
第二个话题
第二章
概述
第2.1子章
新话题
请本着.Done的精神删除所有不相关的代码。很抱歉:)如果可以选择更改技术,请使用XPath。要获取所有标题节点,您只需使用
//caption
。听起来很有趣,如果我无法获得它,我将尝试一下!谢谢无论如何,我都考虑过尝试XPath(不过之前从未使用过)。嘿,谢谢你的回答。我去看看有没有用。
<?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>
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 {

    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) {
        NodeList nodes = n.getChildNodes();

        if (n.getNodeName().equals("caption")) {
            System.out.println(n.getFirstChild().getNodeValue());
        }

        for (int i = 0; i < nodes.getLength(); i++) {
            giveCaption(nodes.item(i));
        }
    }
}