Я хочу проанализировать XML файл для чтения значений определенных элементов в файле.
<row>
<element>
<status>OK</status>
<duration>
<value>499</value>
<text>8 mins</text>
</duration>
<distance>
<value>3208</value>
<text>3.2 km</text>
</distance>
</element>
<element>
<status>OK</status>
<duration>
<value>501</value>
<text>8 mins</text>
</duration>
<distance>
<value>2869</value>
<text>2.9 km</text>
</distance>
</element>
<element>
<status>OK</status>
<duration>
<value>788</value>
<text>13 mins</text>
</duration>
<distance>
<value>6718</value>
<text>6.7 km</text>
</distance>
</element>
</row>
Я хочу читать значения всех тегов "value" под тегами "distance". Я сделал базовый код для чтения данных XML. Я просто хочу, чтобы идея читала значение элементов на третьем уровне
Ниже код может помочь вам получить доступ к элементу value
.
import java.io.FileInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class DOMParsarDemo {
protected DocumentBuilder docBuilder;
protected Element root;
public DOMParsarDemo() throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
docBuilder = dbf.newDocumentBuilder();
}
public void parse(String file) throws Exception {
Document doc = docBuilder.parse(new FileInputStream(file));
root = doc.getDocumentElement();
System.out.println("root element is :" + root.getNodeName());
}
public void printAllElements() throws Exception {
printElement(root);
}
public void printElement(Node node) {
if (node.getNodeType() != Node.TEXT_NODE) {
Node child = node.getFirstChild();
while (child != null) {
if (node.getNodeName().equals("distance")) {
if (child.getNodeName().equals("value")) {
System.out.println(child.getFirstChild().getNodeValue());
}
}
printElement(child);
child = child.getNextSibling();
}
}
}
public static void main(String args[]) throws Exception {
DOMParsarDemo demo = new DOMParsarDemo();
demo.parse("resources/abc.xml");
demo.printAllElements();
}
}
вывод:
root element is :row
3208
2869
6718
Простой разбор DOM больше не является предпочтительным способом ИМХО. Java поставляется с некоторыми зрелыми фреймворками, что значительно облегчает процесс синтаксического анализа. Следующее - это мое предпочтение. Другие могут думать иначе.
Если структура вашего XML исправлена, вы можете создать некоторые аннотированные текстовые поля JAXB и прочитать данные с этим. JAXB предоставляет полные иерархии объектов, заполненные вашими значениями XML. Также предоставляется создание XML-данных.
Если вы не знаете структуру своих XML-данных или потоки данных XML, возможно, STAX- синтаксический анализ - это путь.
В любом случае эти рамки отнимают много проблем от вас, как кодирование файлов, проверка синтаксиса, безопасность типов (JAXB),....
Если вы хотите использовать разбор DOM, вы можете использовать XPath для резкого сокращения ваших запросов:
XPath xPath = XPathFactory.newInstance().newXPath();
InputSource source = new InputSource(ParseUsingXPath.class.getResourceAsStream("data.xml"));
NodeList list = (NodeList) xPath.evaluate("/row/element/distance/value", source, XPathConstants.NODESET);
for (int i=0;i<list.getLength();i++) {
System.out.println(list.item(i).getTextContent());
}
и он выводит:
3208
2869
6718
Здесь я использую ваш XML непосредственно как StringStream из файла. Вы можете использовать XPath с объектом документа DOM, а также для обработки глобальных запросов.
Вы уже использовали xsd определение xml? С помощью этого и jaxb вы можете легко отменить xml для java-объекта.
value
представленному в элементеdistance