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