Парсинг содержимого элемента по его name

144
04 июня 2019, 09:00

Есть

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<map>
      <string name="photo_link"></string>  
      <string name="user_id">372fb7af6e0d2719d1babb6ad86dab46</string>
</map>

Хочу спарсить вторую строку по ее name, name="user_id", а точнее спарсить ее содержимое через XML DOM, как это сделать.

Это не работает:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = factory.newDocumentBuilder();
    Document document = documentBuilder.parse(new File("/Users/k1ceargy/Desktop/testFile.xml"));
    Element element = document.getDocumentElement();
    System.out.println(element.getAttributes().getNamedItem("user_id").getNodeValue());
Answer 1

Одним из вариантов вытаскивания значения будет через xpath выражения.

Пример:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
Document document = documentBuilder.parse(new File("/Users/k1ceargy/Desktop/testFile.xml"));
...
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
// Или так: "map/string[@name=\"user_id\"]/text()"
XPathExpression expr = xpath.compile("//*[@name=\"user_id\"]/text()");
// Если элементов несколько нужно найти указывать XPathConstants.NODESET и приводить к NodeList
Node nl = (Node) expr.evaluate(document, XPathConstants.NODE);
// Или nl.getTextContent()
System.out.println(nl.getNodeValue());  // 372fb7af6e0d2719d1babb6ad86dab46

Еще можно через работу с DOM вручную найти нужные элементы:

NodeList nodes = document.getElementsByTagName("string");
for (int i = 0; i < nodes.getLength(); i++) {
    Node node = nodes.item(i);
    Node attr = node.getAttributes().getNamedItem("name");
    if (attr != null && "user_id".equals(attr.getTextContent())) {
        System.out.println(node.getTextContent()); // 372fb7af6e0d2719d1babb6ad86dab46
    }
}

PS. Если кода много, то всегда его можно обернуть в функцию:

static String getNodeValueByName(Document doc, String name) throws XPathExpressionException {
    XPath xpath = XPathFactory.newInstance().newXPath();
    String xpathStr = String.format("//*[@name=\"%s\"]/text()", name);
    XPathExpression expr = xpath.compile(xpathStr);
    Node nl = (Node) expr.evaluate(doc, XPathConstants.NODE);
    if (nl == null) {
        return null;
    }
    return nl.getNodeValue();
}
...
System.out.println(getNodeValueByName(document, "photo_link")); // null
System.out.println(getNodeValueByName(document, "user_id"));    // 372fb7af6e0d2719d1babb6ad86dab46
READ ALSO
Css3 появление элемента при :checked

Css3 появление элемента при :checked

Пишу свое адаптивное менюВсе работает

170
Отложенные сообщения Telegram bot Node.js

Отложенные сообщения Telegram bot Node.js

Всем здравствуйтеДелаю бота для Telegram на Node

137
Ошибка JS: TypeError: Electron.inita is not a constructor

Ошибка JS: TypeError: Electron.inita is not a constructor

Выдает такого рода ошибкуПогуглил, узнал, что она возникает когда пытаешься вызвать функцию как конструктор, но это не конструктор

160
Как правильно вызвать функцию?

Как правильно вызвать функцию?

Как правильно вызвать функцию в Jquery, если её название записано в переменную?

128