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());
Ответы
Ответ 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);