试图用Java获取XML节点

时间:2014-11-06 16:54:31

标签: java xml dom null

        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代表什么:节点值?

  1. [ROOT:NULL] - 调试时看到的内容
  2. [BOOK:NULL] - 我在调试时看到的内容
  3. [#text:] - 调试时看到的内容 - 这是什么意思?
  4. 问题!!这里lastSubChapter得到NULL :(为什么?
  5. 我正在阅读的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”的节点。

    还有另一种更安全的方法吗?

2 个答案:

答案 0 :(得分:4)

由于XML内容的缩进,BOOKChapter的子项还包括空格(即文本内容)。所以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:

How to serialize and de-serialize objects using JAXB?