#java #xml #xpath
#java #xml #xpath
Вопрос:
Я хотел бы получить одно конкретное значение узла, если дочерний узел отличается, как присутствует в моем выражении :
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(new File("test.xml"));
List<String> data = new ArrayList<>();
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList) xpath.evaluate("/name1/type/*[name()!= 'pmc']", document, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i ) {
Element el = (Element) nodes.item(i);
data.add(el.getAttribute("id"));
}
System.out.println(data);
test.xml :
<?xml version="1.0" encoding="UTF-8"?>
<name1>
<type id ="1">
<coord>67</coord>
<lmc>57657</lmc>
</type>
<lang>
<eng>989</eng>
<spa>123</spa>
</lang>
</name1>
<name2>
<type id ="2">
<coord>534</coord>
<lmc>654654</lmc>
</type>
<lang>
<eng>354</eng>
<spa>2424</spa>
</lang>
</name2>
<name3>
<type>
<coord>23432</coord>
<pmc>14324</pmc>
</type>
<lang>
<eng>141</eng>
<spa>142</spa>
</lang>
</name3>
Например, я хотел бы получить только значение, id
если дочерний узел является 'pmc'
, а не другие.
Комментарии:
1. Ваш xml недопустим (например
<pmc>14324</umc>
). Можете ли вы отредактировать свой вопрос и исправить его?2. В чем именно проблема? Выполняется ли ваш код? Есть ли ошибки? Затем отправьте сообщение об ошибке и полную трассировку стека.
3. @vanje Ошибки нет, я просто не могу получить данные так, как хотелось бы
4. Тогда вы должны упомянуть это в своем вопросе. И, пожалуйста, укажите ожидаемый результат и фактический результат. В предикате вы имеете в виду функцию
name()
? Затем вы должны включить круглые скобки.5. @vanje да, извините… да, я имею в виду,
name()
но, похоже,!=
это не работает..
Ответ №1:
Поскольку вопрос не совсем ясен, давайте попробуем это так.
Предполагая, что ваш xml читается следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<name1>
<type id ="1">
<coord>67</coord>
<lmc>57657</lmc>
</type>
<lang>
<eng>989</eng>
<spa>123</spa>
</lang>
</name1>
<name2>
<type id ="2">
<coord>534</coord>
<lmc>654654</lmc>
</type>
<lang>
<eng>354</eng>
<spa>2424</spa>
</lang>
</name2>
<name3>
<type id ="3">
<coord>23432</coord>
<pmc>14324</pmc>
</type>
<lang>
<eng>141</eng>
<spa>142</spa>
</lang>
</name3>
и что вы пытаетесь получить значение атрибута <id>
любого <type>
узла, у которого есть <pmc>
дочерний узел, попробуйте использовать следующее в качестве выражения xpath:
//*/type[pmc]/@id