用Nodelist和DocumentBuilder解析XML并获得值



我已经遵循了几乎所有的问题和答案,有些问题和答案有意义,而另一些则没有,我能够在某些时候让我的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>

我想通过文档循环,然后循环循环" sort_by_letters"one_answers" sort_by_rank",并获取每个'letter_row'的值。

这是我获取文档的方式:

 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();

我实际上可以获取文档,但是对于我的一生,我无法弄清楚如何工作以获得我需要的东西。

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

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);
                }
            }
        }
    }
}

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

输出:

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

回答评论:如果您只想获取" sort_by_letter" xml元素,则可以在此处添加额外的内容...

    ...
    for (int k = 0; k < sortByNodes.getLength(); k++) {
        Node sortBy = sortByNodes.item(k);
        if(sortBy.getNodeName().equals("sort_by_letter")) {
            System.out.println("SORT BY: " + sortBy.getNodeName());
            ...

最新更新