Java jdom не печатает все элементы, печатает пустую строку - PullRequest
0 голосов
/ 03 декабря 2018

Во-первых, у меня есть 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) Почему печатается только один элемент "книга", а другой пустой?

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

(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, а затем зациклю его дочерние элементы и выберу те, которыеbook s, я получаю ожидаемый результат:

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 > book элемента, он перечисляет столько, сколько их есть.

0 голосов
/ 03 декабря 2018

ваш xml немного странный, потому что <book> представляет две разные вещи.

Я советую пометить ваш документ как более читаемый с <title> для заголовка, а не <book>.

<?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>
0 голосов
/ 03 декабря 2018

Это из-за вложенного тега <book>.Поскольку тег <book> внутри <book>, синтаксический анализатор считает <book>Oracle</book> второй записью.

 <book ISBN="c01" press="AD press">
        <book>Oracle</book> //<book> tag inside <book>
        <Author>Smith</Author>
        <price>32.00</price>
    </book>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...