выражение java xpath получает только значение, если дочерний узел отличается

#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