У меня небольшие проблемы с разбором некоторых XML в java. Мой XML файл читается корректно и я могу получить большую часть информации из файла без каких-либо проблем (т.е. StreamType узел, показанный в xml фрагменте), используя функцию узлов getTextContent().
Но когда я пытаюсь работать с дочерними элементами узла, обе функции getNodeValue() и getTextContent() возвращают это случайное значение: "\n \t\t".
СвойствоNodeList кажется правильно заполненным (содержит все 18 элементов свойства).
Вот отрывок из моего кода:
Document document;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(appXML);
...
String typeName = document.getElementsByTagName("StreamType").item(0).getTextContent();
...
String limit = "-1";
NodeList propertyNodes = document.getElementsByTagName("Property");
int nodelistlength = propertyNodes.getLength();
for (int i = 0; i < nodelistlength; i++) {
Node currentNode = propertyNodes.item(i);
Node nameNode = currentNode.getFirstChild();
Node valueNode = currentNode.getLastChild();
String name = nameNode.getNodeValue();
String value = valueNode.getNodeValue();
if (nameNode.getTextContent().equalsIgnoreCase("maxConnections"))
limit = valueNode.getTextContent();
}
А вот несколько отрывков из XML, который я пытаюсь разобрать:
<Root>
<Application>
<Streams>
<StreamType>live</StreamType>
...
</Streams>
...
<Properties>
...
<Property>
<Name>maxConnections</Name>
<Value>1000</Value>
</Property>
...
</Properties>
</Application>
</Root>
Есть идеи, что я здесь делаю неправильно? Большое спасибо!
EDIT: Теперь работает, благодаря учебнику, размещенному @home. Вот как я исправил код:
1) Модифицировал блок кода, начиная с "String limit" и заканчивая скобкой конца цикла for:
String limit = "-1";
NodeList propertyNodes = document.getElementsByTagName("Property");
for (int i = 0; i < propertyNodes.getLength(); i++) {
Node currentNode = propertyNodes.item(i);
if (currentNode.getNodeType() != Node.ELEMENT_NODE)
continue;
Element currentElement = (Element)currentNode;
if (getTagValue("Name",currentElement).equalsIgnoreCase("maxConnections"))
limit = getTagValue("Value",currentElement);
}
2) Добавил эту удобную функцию из учебника:
private static String getTagValue(String sTag, Element eElement) {
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
Node nValue = (Node) nlList.item(0);
return nValue.getNodeValue();
}
Теперь она безупречно извлекает пары имя/значение дочернего элемента "Properties". Большое спасибо!