【问题标题】:Java jdom doesn't print all elements, prints empty stringJava jdom 不打印所有元素,打印空字符串
【发布时间】:2019-05-04 13:50:04
【问题描述】:

首先,我有 xml 文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bookshelf>
    <book ISBN="c01" press="AD press">
        <book>Oracle</book>
        <Author>Smith</Author>
        <price>32.00</price>
    </book>
    <book ISBN="b11" press="XY press">
        <book>Android</book>
        <Author>Smith</Author>
        <price>35.00</price>
    </book>
</bookshelf>

然后有java代码:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(currentPath + "/book.xml");
for (int i = 0; i < 2; ++i) {
    System.out.println("begin");
    Node n = document.getElementsByTagName("book").item(i);
    Element e = (Element) n;
    System.out.println(e.getAttribute("ISBN"));
    System.out.println(e.getAttribute("press"));
    System.out.println("end");
}

然后打印:

begin
b11
XY press
end
begin


end

这对我来说很奇怪:

(1) 为什么打印的第一个元素是“b11”而不是“c01”?这是第一个元素。

(2)为什么只打印一个“书”元素,另一个是空的?

非常感谢。

【问题讨论】:

    标签: java xml pom.xml element document


    【解决方案1】:

    (1) 为什么打印的第一个元素是“b11”而不是“c01”?这是第一个元素。

    对我来说没有。我得到了c01,然后是一个空白条目,考虑到输入,这很有意义。

    (2)为什么只打印一个“书”元素,另一个是空的?

    因为您在其他 book 元素中有 book 元素。 getElementsByTagName 返回所有四个。第二个是嵌套在第一个中的:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <bookshelf>
        <book ISBN="c01" press="AD press">      #1 (index 0)
            <book>Oracle</book>                 #2 (index 1)
            <Author>Smith</Author>
            <price>32.00</price>
        </book>
        <book ISBN="b11" press="XY press">      #3 (index 2)
            <book>Android</book>                #4 (index 3)
            <Author>Smith</Author>
            <price>35.00</price>
        </book>
    </bookshelf>
    

    我对这个特定的 API 不是很熟悉,但是如果我得到 bookshelf,然后循环它的孩子并挑选出 books 的孩子,我会得到预期的输出:

    import javax.xml.parsers.*;
    import org.w3c.dom.*;
    
    class Example {
        public static final void main(String[] args) throws Exception {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse("book.xml");
            NodeList bookshelves = document.getElementsByTagName("bookshelf");
            if (bookshelves.getLength() > 0) {
                Element bookshelf = (Element)bookshelves.item(0);
                NodeList children = bookshelf.getChildNodes();
                for (int i = 0, l = children.getLength(); i < l; ++i) {
                    Node child = children.item(i);
                    if (child.getNodeName().equals("book")) {
                        Element book = (Element)child;
                        System.out.println(book.getAttribute("ISBN"));
                        System.out.println(book.getAttribute("press"));
                    }
                }
            }
        }
    }
    

    该代码假定为单个书架,显然可以根据需要进行调整。它不假设只有两个 bookshelf &gt; book 元素,它列出了尽可能多的元素。

    【讨论】:

      【解决方案2】:

      这是因为嵌套了&lt;book&gt; 标签。由于&lt;book&gt; 中的&lt;book&gt; 标记,解析器将&lt;book&gt;Oracle&lt;/book&gt; 视为第二条记录。

       <book ISBN="c01" press="AD press">
              <book>Oracle</book> //<book> tag inside <book>
              <Author>Smith</Author>
              <price>32.00</price>
          </book>
      

      【讨论】:

        【解决方案3】:

        你的 xml 有点奇怪,因为&lt;book&gt; 代表两个不同的东西。

        我的建议是使用&lt;title&gt; 作为标题而不是&lt;book&gt;,将您的文档标记为更具可读性。

        <?xml version="1.0" encoding="UTF-8" standalone="no"?>
        <bookshelf>
            <book ISBN="c01" press="AD press">
                <title>Oracle</title>
                <Author>Smith</Author>
                <price>32.00</price>
            </book>
            <book ISBN="b11" press="XY press">
                <title>Android</title>
                <Author>Smith</Author>
                <price>35.00</price>
            </book>
        </bookshelf>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-08
          • 2013-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多