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

时间:2017-07-20 08:34:19

标签: java xml eclipse recursion nodes

我正在尝试使用递归方法逐个读出XML文件的主题(在“帮助与手册”之外)。

不幸的是,似乎有一些错误,因为程序没有打印出我想要的主题(它什么都没打印出来)并且卡在stackoverflow中。 我找不到它..

我很感激任何帮助!

编辑:我花了一些时间在调试中,除递归本身之外的一个问题肯定是它为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>

2 个答案:

答案 0 :(得分:0)

我知道这不会直接回答你的问题,但是你可以省去很多麻烦并立即开始使用JAXB。 http://www.vogella.com/tutorials/JAXB/article.html

  

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

JAXB可能不适合的唯一原因是,如果您正在阅读非常大的XML文件,并且您希望流式传输内容并快速阅读+处理。

即便在这种情况下,STAX(较新的Java XML库)比SAX更容易使用。 http://www.vogella.com/tutorials/JavaXML/article.html#javastax

答案 1 :(得分:0)

代码看起来像是你从先前的实验中得到的一些东西弄乱了操作的一般流程。此代码与原始代码之间的主要更改是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));
        }
    }
}

这会产生输出:

简介
欢迎主题
第二个主题
第2章 概述
分章2.1
新话题