簡體   English   中英

用NodeList和DocumentBuilder解析Xml並獲取值

[英]parsing Xml with NodeList and DocumentBuilder and getting values

我已經遵循了幾乎所有的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>

我想遍歷文檔並遍歷“ sort_by_letters”和“ 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);
                }
            }
        }
    }
}

(您可能會構建一個對象並將其添加到某個結果列表中,而不是添加到System.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元素,則可以在此處添加一個額外的if子句...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM