Java Android:XML解析获取标记的值

时间:2012-04-25 07:24:30

标签: java android xml xml-parsing nodes

我正在尝试解析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();

2 个答案:

答案 0 :(得分:4)

我建议您使用SAX解析器,它比其他人简单且高效

如何解析:How to parse XML using the SAX parser

答案 1 :(得分:2)

以下是我的Sax Class Generator

生成的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. */