2012-04-25 81 views
0

我想解析一個xml文件,但似乎不理解它是如何工作的。我一直在調試幾個小時,但似乎無法得到正確的價值。我設法得到的代碼的曲目列表標籤的工作,而不是爲playbacklist標籤和他的孩子的標籤。Java Android:XML解析獲取標籤的價值

我想有一個播放設備的價值,在未來更將增加。

這是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(); 
+0

到底是什麼問題了嗎? 「不起作用」不是最好的描述,不起作用。列表是否爲空?我的大孩子名單空了嗎?另外:如果你想再次將條目映射到對象,爲什麼不使用xstream或類似的東西? – schlingel 2012-04-25 07:30:59

回答

2

這裏是產生您的SAXParser我Sax Class Generator

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. */