Подтвердить что ты не робот

Java XML-анализ с использованием DOM для получения значения nodevalue

    try {
        String data = "<a><b c='d' e='f'>0.15</b></a>";
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory
                .newDocumentBuilder();
        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(data));
        Document document = documentBuilder.parse(is);

        NodeList nl = document.getElementsByTagName("b");
        Node n = (Node) nl.item(0);
        System.out.println(n.getNodeValue());
    } catch (Exception e) {
        System.out.println("Exception " + e);

    }

Я ожидаю, что он напечатает 0,15, но он напечатает нуль. Любые идеи?

Изменить: это сделало трюк

        if (n.hasChildNodes())
            System.out.println(n.getFirstChild().getNodeValue());
        else 
            System.out.println(n.getNodeValue());
4b9b3361

Ответ 1

Это потому, что элемент фактически не имеет nodeValue. Вместо этого он имеет текст node в качестве дочернего элемента, который имеет nodeValue, который вы хотите.

Короче говоря, вы захотите getNodeValue() для первого дочернего элемента элемента node.

Иногда элемент содержит несколько текстовых узлов, так как они имеют максимальный размер, и в этом случае вам понадобится что-то подобное на предыдущей странице:

public static String getNodeValue(Node node) {
    StringBuffer buf = new StringBuffer();
    NodeList children = node.getChildNodes();
    for (int i = 0; i < children.getLength(); i++) {
        Node textChild = children.item(i);
        if (textChild.getNodeType() != Node.TEXT_NODE) {
            System.err.println("Mixed content! Skipping child element " + textChild.getNodeName());
            continue;
        }
        buf.append(textChild.getNodeValue());
    }
    return buf.toString();
}

Ответ 2

Попробуйте извлечь его из элемента, а не из Node:

try {
    String data = "<a><b c='d' e='f'>0.15</b></a>";
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
            .newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory
            .newDocumentBuilder();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(data));
    Document document = documentBuilder.parse(is);

    NodeList nl = document.getElementsByTagName("b");
    Element el = (Element) nl.item(0);
    Text elText = (Text) el.getFirstChild();
    String theValue = elText.getNodeValue();
    System.out.println(theValue);
} catch (Exception e) {
    System.out.println("Exception " + e);
}

Ответ 3

System.out.println(n.getFirstChild().getNodeValue());

Ответ 4

 private String getTextValue(Element element, String string) {
    String textVal = null;
    NodeList nl = element.getElementsByTagName(string);
    if(nl != null && nl.getLength() > 0) {
        Element el = (Element)nl.item(0);
        textVal = el.getFirstChild().getNodeValue();
    }

    return textVal;

}

Ответ 5

Если node не имеет дополнительных вложенных потомков, чем n.getTextContent() работает достаточно хорошо.

Ответ 6

Вы можете использовать jOOX в качестве обертки для стандартного DOM, чтобы упростить ваш код.

String data = "<a><b c='d' e='f'>0.15</b></a>";
String value = $(data).find("b").text();

Вы также можете преобразовать это значение в jOOX, например:

Double value = $(data).find("b").text(Double.class);