Разбор XML-файла в Java с использованием DOM

1

Я хочу проанализировать 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. Я просто хочу, чтобы идея читала значение элементов на третьем уровне

Теги:

3 ответа

0
Лучший ответ

Ниже код может помочь вам получить доступ к элементу 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
  • 0
    Я обновил свой код для доступа к элементу value представленному в элементе distance
2

Простой разбор DOM больше не является предпочтительным способом ИМХО. Java поставляется с некоторыми зрелыми фреймворками, что значительно облегчает процесс синтаксического анализа. Следующее - это мое предпочтение. Другие могут думать иначе.

  1. Если структура вашего XML исправлена, вы можете создать некоторые аннотированные текстовые поля JAXB и прочитать данные с этим. JAXB предоставляет полные иерархии объектов, заполненные вашими значениями XML. Также предоставляется создание XML-данных.

  2. Если вы не знаете структуру своих 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, а также для обработки глобальных запросов.

  • 0
    Хорошо, ты прав. Я действительно могу пойти на JaxB. Но в моем проекте данные XML исправлены
  • 1
    Так что, если это исправить, тогда иди к Jaxb. Независимо от принятого ответа. Это просто лучше, имхо.
1

Вы уже использовали xsd определение xml? С помощью этого и jaxb вы можете легко отменить xml для java-объекта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню