Разбор XML-файла с помощью DOM (Java) - PullRequest
1 голос
/ 26 октября 2011

Я хочу разобрать следующий URL: http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=nucleotide&id=224589801

В результате я придумал следующий метод:

public void parseXml2(String URL) {
    DOMParser parser = new DOMParser();

    try {
        parser.parse(new InputSource(new URL(URL).openStream()));
        Document doc = parser.getDocument();

        NodeList nodeList = doc.getElementsByTagName("Item");
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node n = nodeList.item(i);
            Node actualNode = n.getFirstChild();
            if (actualNode != null) {
                System.out.println(actualNode.getNodeValue());
            }
        }

    } catch (SAXException ex) {
        Logger.getLogger(TaxMapperXml.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(TaxMapperXml.class.getName()).log(Level.SEVERE, null, ex);
    }
}

С помощью этого метода я могу получить значения узлов Item, но не могу получить ни один из их атрибутов. Я попытался поэкспериментировать с getAttribute () с NamedNodeMap, но все еще безрезультатно.

  1. Почему я должен сделать n.getFirstChild().getNodeValue();, чтобы получить фактическое значение? n.getNodeValue() возвращает только ноль? Разве это не интуитивно понятно - очевидно, в моем случае узлы не имеют подузлов?

  2. Существует ли более надежный и общепринятый способ анализа файлов XML с использованием DOM? Мои файлы не должны быть большими 15-20 строками, поэтому SAX не нужен (или это?)

Ответы [ 3 ]

6 голосов
/ 26 октября 2011
  1. Текстовое значение, окруженное тегом XML, также считается узлом в DOM. Вот почему вы должны получить текстовый узел, прежде чем получить значение. Если вы попытаетесь посчитать количество узлов в <Item>, вы увидите, что всякий раз, когда есть текст, есть узел.

  2. XOM имеет более интуитивно понятный интерфейс, но не имеет интерфейса org.w3c.dom.*.

Если вы хотите использовать встроенный синтаксический анализатор, вам следует посмотреть http://www.java -samples.com / showtutorial.php? Tutorialid = 152

DOMParser, который вы пытались использовать, являются приличными и не переносимы.

5 голосов
/ 26 октября 2011
import java.io.IOException;
import java.net.URL;
import org.apache.xerces.parsers.DOMParser;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class XMLParser {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        parseXml2("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=nucleotide&id=224589801");
    }

    public static void parseXml2(String URL) {
        DOMParser parser = new DOMParser();

        try {
            parser.parse(new InputSource(new URL(URL).openStream()));
            Document doc = parser.getDocument();

            NodeList nodeList = doc.getElementsByTagName("Item");
            for (int i = 0; i < nodeList.getLength(); i++) {
                System.out.print("Item "+(i+1));
                Node n = nodeList.item(i);
                NamedNodeMap m = n.getAttributes();
                System.out.print(" Name: "+m.getNamedItem("Name").getTextContent());
                System.out.print(" Type: "+m.getNamedItem("Type").getTextContent());
                Node actualNode = n.getFirstChild();
                if (actualNode != null) {
                    System.out.println(" "+actualNode.getNodeValue());
                } else {
                    System.out.println(" ");                    
                }
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

Завершил пример кода и добавил несколько строк для получения атрибутов.

Это должно помочь вам начать, хотя я чувствую, что вам нужно познакомиться с основными понятиями DOM. Этот сайт (и многие другие) может помочь вам в этом. Наиболее важным является понимание различных видов узлов.

1 голос
/ 26 октября 2011

Текст внутри элементов xml находится в текстовых узлах, поскольку подэлементы можно смешивать с текстом.Например:

...
<A>blah<B/>blah</A>
...

Элемент A имеет три дочерних элемента: текстовый узел, элемент B, другой текстовый узел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...