【问题标题】:Java Android : XML Parsing getting the value of a tagJava Android:获取标签值的XML解析
【发布时间】:2012-04-25 07:24:29
【问题描述】:

我正在尝试解析一个 xml 文件,但似乎不明白它是如何工作的。我已经调试了几个小时,但似乎无法获得正确的值。我已经设法让代码适用于 tracklist 标签,但不适用于播放列表标签及其子标签。

我想要一个播放设备的值,将来会添加更多。

这是 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代码(代码的sn-ps):这个代码对我有用

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

【问题讨论】:

  • 您的问题到底是什么? “不起作用”并不是什么不起作用的最佳描述。列表是空的吗?大子列表是空的吗?另外:如果您想再次将条目映射到对象,为什么不使用 xstream 或类似的东西?

标签: java android xml xml-parsing nodes


【解决方案1】:

我会建议你使用SAX解析器,它比其他的简单高效

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

【讨论】:

    【解决方案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. */  
    

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多