簡體   English   中英

Java Android:XML解析獲取標簽的值

[英]Java Android : XML Parsing getting the value of a tag

我正在嘗試解析xml文件,但似乎不明白它是如何工作的。 我已經調試了幾個小時,但似乎無法獲得正確的值。 我設法使代碼適用於tracklist標記,但不適用於playbacklist標記及其子標記。

我想擁有回放設備的值,將來會添加更多。

這是xml來源:

<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<tracklist>
    <track>track001.mp3</track>
    <track>track002.mp3</track>
    <track>track003.mp3</track>
    <track>track004.mp3</track>
    <track>track005.mp3</track>
    <track>track006.mp3</track>
    <track>track007.mp3</track>
    <track>track008.mp3</track>
    <track>track009.mp3</track>
    <track>track010.mp3</track>
</tracklist>
<playbacklist>
    <playback>
        <name>Speaker1</name>
        <ip>192.168.1.103</ip>
        <room>Kitchen</room>
        <options>0</options>
        <state>NotPlaying</state>
    </playback>
</playbacklist>
</root>

這是java代碼(代碼片段):此代碼對我有用

DocumentBuilder db = factory.newDocumentBuilder();
Document doc = db.parse(inStream);
NodeList nodeList = doc.getElementsByTagName("root");

for (int index = 0; index < nodeList.getLength(); index++) {
Node node = nodeList.item(index);
if (node.getNodeType() == Node.ELEMENT_NODE) {
    Element element = (Element) node;
    NodeList nameNode = element.getChildNodes();
    for (int iIndex = 0; iIndex < nameNode.getLength(); iIndex++) {
        if (nameNode.item(iIndex).getNodeType() == Node.ELEMENT_NODE) {
                Element nameElement = (Element) nameNode.item(iIndex);
                    if(nameElement.getNodeName().equals("tracklist")){
                NodeList trackNodes = nameElement.getChildNodes();
            for(int i=0;i<trackNodes.getLength();i++){
                if (trackNodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
                    Element trackElement = (Element) trackNodes.item(i);
                    playlist.add(trackElement.getFirstChild().getNodeValue());
                    }
                }
            } 

此代碼不適用於我:

        if(nameElement.getNodeName().equals("playbacklist")){
            NodeList devicesNodes = nameElement.getChildNodes();
            for(int j=0;j<=devicesNodes.getLength();j++){
                Node nodeDevice = devicesNodes.item(j);
                NodeList childNodes = nodeDevice.getChildNodes();

我建議您使用SAX解析器,它比其他解析器更簡單,更高效

如何解析: 如何使用SAX解析器解析XML

這是我的Sax類生成器生成的SaxParser

package sherif.java.sax;

import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class YourHandler extends DefaultHandler
{
    //TAGS      /\Sherif/\
    private boolean root = false;
    private boolean playbacklist = false;
    private boolean playback = false;
    private boolean name = false;
    private boolean ip = false;
    private boolean room = false;
    private boolean options = false;
    private boolean state = false;
    private boolean tracklist = false;
    private boolean track = false;

    public YourHandler()
    {
        //TODO      /\Sherif/\
    }

    @Override
    public void startDocument() throws SAXException
    {
        super.startDocument();
        //TODO      /\Sherif/\
    }

    @Override
    public void endDocument() throws SAXException
    {
        super.endDocument();
        //TODO      /\Sherif/\
    }

    @Override
    public void characters(char sherifCh[], int sherifSt, int sherifle)
    {
        String value = (new String(sherifCh)).substring(sherifSt, sherifSt + sherifle);
        if(root)
        {
            if(playbacklist)
            {
                if(playback)
                {
                    if(name)
                    {
                        //TODO      /\Sherif/\

                    }
                    else if(ip)
                    {
                        //TODO      /\Sherif/\

                    }
                    else if(room)
                    {
                        //TODO      /\Sherif/\

                    }
                    else if(options)
                    {
                        //TODO      /\Sherif/\

                    }
                    else if(state)
                    {
                        //TODO      /\Sherif/\

                    }
                }
            }
            else if(tracklist)
            {
                if(track)
                {
                    //TODO      /\Sherif/\

                }
            }
        }
    }

    @Override
    public void startElement(String sherifUr, String sherifNa, String sherifQn, org.xml.sax.Attributes sherifAt) throws SAXException
    {
        super.startElement(sherifUr, sherifNa, sherifQn, sherifAt);
        if(sherifNa.equals("root"))
        {
            this.root = true;
        }
        else if(sherifNa.equals("playbacklist"))
        {
            this.playbacklist = true;
        }
        else if(sherifNa.equals("playback"))
        {
            this.playback = true;
        }
        else if(sherifNa.equals("name"))
        {
            this.name = true;
        }
        else if(sherifNa.equals("ip"))
        {
            this.ip = true;
        }
        else if(sherifNa.equals("room"))
        {
            this.room = true;
        }
        else if(sherifNa.equals("options"))
        {
            this.options = true;
        }
        else if(sherifNa.equals("state"))
        {
            this.state = true;
        }
        else if(sherifNa.equals("tracklist"))
        {
            this.tracklist = true;
        }
        else if(sherifNa.equals("track"))
        {
            this.track = true;
        }
    }

    @Override
    public void endElement(String sherifUr, String sherifNa, String sherifQn) throws SAXException
    {
        super.endElement(sherifUr, sherifNa, sherifQn);
        if(sherifNa.equals("root"))
        {
            this.root = false;
        }
        else if(sherifNa.equals("playbacklist"))
        {
            this.playbacklist = false;
        }
        else if(sherifNa.equals("playback"))
        {
            this.playback = false;
        }
        else if(sherifNa.equals("name"))
        {
            this.name = false;
        }
        else if(sherifNa.equals("ip"))
        {
            this.ip = false;
        }
        else if(sherifNa.equals("room"))
        {
            this.room = false;
        }
        else if(sherifNa.equals("options"))
        {
            this.options = false;
        }
        else if(sherifNa.equals("state"))
        {
            this.state = false;
        }
        else if(sherifNa.equals("tracklist"))
        {
            this.tracklist = false;
        }
        else if(sherifNa.equals("track"))
        {
            this.track = false;
        }
    }
}

您可以使用它:

String yourXmlString;  
SAXParserFactory spf = SAXParserFactory.newInstance();  
SAXParser sp = spf.newSAXParser();  
XMLReader xr = sp.getXMLReader();  

/* Create a new instance of the class generated */  
YourHandler handler = new YourHandler ();  
xr.setContentHandler(handler);  

InputSource inputSource = new InputSource();  
inputSource.setEncoding("UTF-8");  
inputSource.setCharacterStream(new StringReader(response));  

/* Start Parsing */  
xr.parse(inputSource);  
/* Parsing Done. */  

暫無
暫無

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

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