使用NodeList和DocumentBuilder解析Xml并获取值

时间:2016-11-29 16:17:19

标签: java xml dom

我几乎都关注了所有的SO问题和答案,有些是有道理的,而其他人没有,我能够在某些时候让我的一些xml工作。在这一点上,我有一个无所事事的蹒跚。

以下是我正在尝试使用

的xml
<GET_GUESS_CHART>
    <sort_by_letter>
        <letter_row>
            <letter>A</letter>
            <guess>16</guess>
            <rank>3</rank>
        </letter_row>
        <letter_row>
            <letter>B</letter>
            <guess>5</guess>
            <rank>1</rank>
        </letter_row>
    </sort_by_letter>
    <sort_by_rank>
        <letter_row>
            <letter>A</letter>
            <guess>16</guess>
            <rank>1</rank>
        </letter_row>
        <letter_row>
            <letter>E</letter>
            <guess>15</guess>
            <rank>2</rank>
        </letter_row>
    </sort_by_rank>
</GET_GUESS_CHART>

我想循环浏览文档并循环浏览&#39; sort_by_letters&#39;和&#39; sort_by_rank&#39;并获得每个&#39; letter_row&#39;。

的值

以下是我如何获取该文件:

 URL url = new URL(Url[0]);
            DocumentBuilderFactory dbf = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            // Download the XML file
            Document doc = db.parse(new InputSource(url.openStream()));
            doc.getDocumentElement().normalize();

我能够真正获得该文件,但是对于我的生活来说无法想象如何使用它来获得我需要的东西。

1 个答案:

答案 0 :(得分:1)

您需要做的就是走DOM树......

ArrayList.toArray()

(您可能会构建一个对象并将其添加到某些结果列表而不是System.out行...)

输出:

import java.io.ByteArrayInputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXML {

    private static final String XML = "<?xml version=\"1.0\"?>\n" 
            + "<GET_GUESS_CHART>" 
            + "    <sort_by_letter>" 
            + "        <letter_row>"
            + "            <letter>A</letter>" 
            + "            <guess>16</guess>" 
            + "            <rank>3</rank>" 
            + "        </letter_row>"
            + "        <letter_row>" +
            + "            <letter>B</letter>" 
            + "            <guess>5</guess>" 
            + "            <rank>1</rank>"
            + "        </letter_row>" 
            + "    </sort_by_letter>" 
            + "    <sort_by_rank>" 
            + "        <letter_row>" 
            + "            <letter>A</letter>"
            + "            <guess>16</guess>" 
            + "            <rank>1</rank>" 
            + "        </letter_row>" 
            + "        <letter_row>"
            + "            <letter>E</letter>" 
            + "            <guess>15</guess>" 
            + "            <rank>2</rank>" 
            + "        </letter_row>"
            + "    </sort_by_rank>" 
            + "</GET_GUESS_CHART>";

    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(new ByteArrayInputStream(XML.getBytes()));

        NodeList rootElement = doc.getChildNodes();

        NodeList sortByNodes = rootElement.item(0).getChildNodes();

        for (int k = 0; k < sortByNodes.getLength(); k++) {
            Node sortBy = sortByNodes.item(k);

            System.out.println("SORT BY: " + sortBy.getNodeName());

            NodeList letterRows = sortBy.getChildNodes();

            for (int j = 0; j < letterRows.getLength(); j++) {
                Node letterRow = letterRows.item(j);
                NodeList letterRowDetails = letterRow.getChildNodes();

                if (letterRowDetails.getLength() > 0) {
                    String letter = null;
                    String guess = null;
                    String rank = null;

                    for (int i = 0; i < letterRowDetails.getLength(); i++) {
                        Node detail = letterRowDetails.item(i);

                        if (detail.getNodeName().equals("letter")) {
                            letter = detail.getTextContent();
                        } else if (detail.getNodeName().equals("guess")) {
                            guess = detail.getTextContent();
                        } else if (detail.getNodeName().equals("rank")) {
                            rank = detail.getTextContent();
                        }
                    }

                    System.out.println("Letter=" + letter + ", guess=" + guess + ", rank=" + rank);
                }
            }
        }
    }
}

回答评论:如果你想得到&#34; sort_by_letter&#34; XML元素,你可以在这里添加一个额外的if子句......

SORT BY: #text
SORT BY: sort_by_letter
Letter=A, guess=16, rank=3
Letter=B, guess=5, rank=1
SORT BY: #text
SORT BY: sort_by_rank
Letter=A, guess=16, rank=1
Letter=E, guess=15, rank=2