2012-04-25 2 views
0

Я пытаюсь разобрать XML-файл, но, похоже, не понимаю, как он работает. Я отлаживал часами, но, похоже, не получил правильное значение. Мне удалось заставить код работать с тегом tracklist, но не для тега списка воспроизведения и его тегов для детей.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

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^