File fXmlFile = new File(path);//path is a String
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document XMLbook = dBuilder.parse(fXmlFile);
Node root = XMLbook.getFirstChild(); //(1)
Node book = XMLbook.getElementsByTagName("BOOK").item(0);//(2)
Node lastChapter=book.getLastChild();//(3)
Node lastSubChapter=lastChapter.getLastChild(); //(4)
...
}
问题是它在lastSubChapter
达到空,所以我的程序结束了:(我不知道我做错了什么......代码似乎没问题。
另外,我不知道NULL代表什么:节点值?
lastSubChapter
得到NULL :(为什么?我正在阅读的XML文件是:
<?xml version="1.0"?>
<ROOT>
<TITLE>Portocalia ca zapada</TITLE>
<BOOK>
<Chapter name="1">
<Subchapter name="1.1">
<paragraph>Primul paragraf!</paragraph>
</Subchapter>
</Chapter>
<Chapter name="2">
<Subchapter name="2.1">
<paragraph>A fost o data ca niciodata</paragraph>
</Subchapter>
<Subchapter name="2.2">
<paragraph>In luna a13a ea s-a maritat.</paragraph>
</Subchapter>
<Subchapter name="2.3">
<paragraph>In continuare, bineinteles</paragraph>
<paragraph>asa cum se intampla in toate povestile</paragraph>
</Subchapter>
</Chapter>
</BOOK>
</ROOT>
我想获取最后一个节点Subchapter
,即名称为“2.3”的节点。
还有另一种更安全的方法吗?
答案 0 :(得分:4)
由于XML内容的缩进,BOOK
和Chapter
的子项还包括空格(即文本内容)。所以getLastChild
正在检索空白文本而不是元素。
您只需通过Element#getElementsByTagName
到达元素并获取最后一个节点。
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document XMLbook = dBuilder.parse(fXmlFile);
Node root = XMLbook.getFirstChild(); //(1)
Node book = XMLbook.getElementsByTagName("BOOK").item(0);//(2)
NodeList chapterNodes = ((Element)book).getElementsByTagName("Chapter");
if(chapterNodes != null && chapterNodes.getLength() > 0) {
Node chapterNode = chapterNodes.item(chapterNodes.getLength() - 1);
NodeList subChapterNodes = ((Element)chapterNode).getElementsByTagName("Subchapter");
if(subChapterNodes != null && subChapterNodes.getLength() > 0) {
Node subChapterNode = subChapterNodes.item(subChapterNodes.getLength() - 1);
System.out.println(subChapterNode.getNodeName());
}
}
答案 1 :(得分:-1)
好的,据我所知,你没有使用JAXB的限制。
从创建模型开始。如下所示:
@XmlRootElement
class Root {
@XmlElement
private String title;
@XmlElement
private Book book;
}
@XmlRootElement
class Book {
@XmlElement
private List<Chapter> chapters;
}
@XmlRootElement
class Chapter {
....
}
等等......,
自己添加getter和setter。
现在看看如何使用JAXB: