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