Сводка :
Обрежьте текстовое содержимое тега и проверьте, пуста ли результирующая строка.
Подробности :
XML в вопросе содержит только один тег, содержащий key="book"
. Я предполагаю, что все 3 раздела должны иметь это, поэтому мы знаем, что каждый представляет собой книгу.
Поэтому я предполагаю, что у вас есть файл XML, подобный приведенному ниже, который включает один пустой тег «автор» и один полностью отсутствующий тег «автор»:
<?xml version="1.0" encoding="UTF-8"?>
<perldata>
<item key="book">
<item key="name">My Book Name</item>
<item key="year">2019</item>
<item key="author">John Smith</item>
</item>
<item key="book">
<item key="name">Anonymous Book Name 1</item>
<item key="year">2018</item>
<item key="author"></item>
</item>
<item key="book">
<item key="name">Her Book Name</item>
<item key="year">2018</item>
</item>
<item key="book">
<item key="name">Another Book Name</item>
<item key="year">2019</item>
<item key="author">Jane Jones</item>
</item>
</perldata>
Исходя из вышеизложенного, вы можете распечатать все имена (включая null
имена) следующим образом:
File file = new File("C:/tmp/Book2.xml");
FileInputStream fis = new FileInputStream(file);
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document xmlDocument = builder.parse(fis);
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList bookNodes = (NodeList) xPath.compile("//item[@key='book']")
.evaluate(xmlDocument, XPathConstants.NODESET);
List<String> authors = new ArrayList();
for (int i = 0; i < bookNodes.getLength(); i++) {
Node bookNode = bookNodes.item(i);
Node authorNode = (Node) xPath.compile("./item[@key='author']")
.evaluate(bookNode, XPathConstants.NODE);
if (authorNode == null) {
authors.add(null);
} else {
String s = authorNode.getTextContent().trim();
authors.add(s.isEmpty() ? null : s);
}
}
System.out.println(authors);
Окончательная инструкция печати дает следующее:
[John Smith, null, null, Jane Jones]
Дополнительные примечания:
Это проходит через все разделы <item key="book">
в файле. Затем для каждого раздела он выполняет этот целевой поиск, но только внутри этого раздела :
Node authorNode = (Node) xPath.compile("./item[@key='author']")
.evaluate(bookNode, XPathConstants.NODE);
evaluate
использует текущую bookNode
в качестве начальной точки.
После этого мы можем проверить все возможные результаты:
- мы нашли тег
key="author"
- и он содержит имя автора. - мы нашли
key="author"
тег - но в нем нет имени. - нет тега
key="author"
для этого book
узла.