2012-05-22 2 views
3

я пытаюсь разобрать файл XML, который выглядит следующим образом:SAXParser В противном случае для конкретных данных

<?xml version="1.0" encoding="utf-8"?> 
<downloaddata> 
    <downloaditem itemid="1"> 
    <title>Abdul kalaam Inspirational Talk</title> 
    <downloadlink>http://o-o.preferred.spectranet-blr1.v8.lscache4.c.youtube.com/videoplayback?upn=Rxb-DvFeBTE&sparams=cp%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&fexp=906512%2C907217%2C907335%2C921602%2C919306%2C919316%2C904455%2C919324%2C904452&itag=18&ip=203.0.0.0&signature=96D7FA17DF684B4C2CD30F12251F3263C83EC443.05F62E98E1059BB44459ABF319F50DC4B7E6D90E&sver=3&ratebypass=yes&source=youtube&expire=1337691481&key=yt1&ipbits=8&cp=U0hSTFZUT19NS0NOMl9OTlNFOmlwaTFSSGFfd3NK&id=67ffa1d50864f57d&title=Abdul%20Kalam%20inspirational%20Speech%20on%20Leadership%20and%20Motivation</downloadlink> 
    </downloaditem> 
</downloaddata> 

кажется, что синтаксический анализ терпит неудачу, когда данные для downloadlink тега, как описаны выше. Я попытался заменить данные чем-то еще одной длины, и он работает.

Ниже приведен код андроид и мы принимаем.

import java.io.File; 
import java.io.IOException; 
import java.util.List; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import org.xml.sax.Attributes; 

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

import android.os.Environment; 

public class Wilxmlparser extends DefaultHandler{ 

List<VideoDetails> downloadList; 
private String tempVal; 
private VideoDetails tempVidDet; 

public Wilxmlparser(){ 

} 

public void parseXML() { 

//get a factory 
SAXParserFactory spf = SAXParserFactory.newInstance(); 
try { 

    //get a new instance of parser 
    SAXParser sp = spf.newSAXParser(); 

    File downloadInfo =new   File(Environment.getExternalStorageDirectory()+"/watchitlater/config/downloadinfo1.xml");   
    //parse the file and also register this class for call backs 
    sp.parse(downloadInfo, this); 

}catch(SAXException se) { 
    se.printStackTrace(); 
}catch(ParserConfigurationException pce) { 
    pce.printStackTrace(); 
}catch (IOException ie) { 
    ie.printStackTrace(); 
} 
} 


//Event Handlers 
@Override 
public void startElement(String uri, String localName, String qName, Attributes  attributes) throws SAXException { 
//reset 
tempVal = ""; 
if(qName.equalsIgnoreCase("downloaditem")) { 
    tempVidDet = new VideoDetails(); 
    tempVidDet.setItemId(Integer.parseInt(attributes.getValue("itemid"))); 
    } 
} 

@Override 
public void characters(char[] ch, int start, int length) throws SAXException { 
tempVal = new String(ch,start,length); 
} 

@Override 
public void endElement(String uri, String localName, String qName) throws SAXException     { 

if(qName.equalsIgnoreCase("downloaditem")) { 
downloadList.add(tempVidDet); 
}else if (qName.equalsIgnoreCase("title")) { 
    tempVidDet.setTitle(tempVal); 
}else if (qName.equalsIgnoreCase("downloadlink")) { 
    tempVidDet.setDownloadLink(tempVal);   
    } 
} 
} 

Приведенный выше код не дает обратный вызов endElement для указанного выше файла XML. однако если XML должны были быть как

<?xml version="1.0" encoding="utf-8"?> 
<downloaddata> 
    <downloaditem itemid="1"> 
     <title>Abdul kalaam Inspirational Talk</title> 
     <downloadlink>http://www.gmail.com/hello/world/sdfsdf%[email protected]@%[email protected]# ($dwe</downloadlink> 
    </downloaditem> 
</downloaddata> 

или

<?xml version="1.0" encoding="utf-8"?> 
<downloaddata> 
    <downloaditem itemid="1"> 
     <title>Abdul kalaam Inspirational Talk</title> 
      <downloadlink>httphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttphttpa</downloadlink> 
    </downloaditem> 
</downloaddata> 

Затем он работает отлично. Что я делаю не так?

ответ

1

Парсер не будет разбирать специальные символы. Вам необходимо заменить, если все специальные символы, присутствующие в

BLOCKQUOTE

http://o-o.preferred.spectranet-blr1.v8.lscache4.c.youtube.com/videoplayback?upn=Rxb-DvFeBTE&sparams=cp%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&fexp=906512%2C907217%2C907335%2C921602%2C919306%2C919316%2C904455%2C919324%2C904452&itag=18&ip=203.0.0.0&signature=96D7FA17DF684B4C2CD30F12251F3263C83EC443.05F62E98E1059BB44459ABF319F50DC4B7E6D90E&sver=3&ratebypass=yes&source=youtube&expire=1337691481&key=yt1&ipbits=8&cp=U0hSTFZUT19NS0NOMl9OTlNFOmlwaTFSSGFfd3NK&id=67ffa1d50864f57d&title=Abdul%20Kalam%20inspirational%20Speech%20on%20Leadership%20and%20Motivation

в Blockquote

вы можете передать этот текст TextUtils.htmlEncode (строка) и затем начните синтаксический анализ. Я думаю, что это сработает или изменит его на стороне сервера, чтобы предоставить вам данные, закодированные с помощью кодировки UTF-8, и со стороны устройства вы можете декодировать с помощью той же кодировки.

+0

Спасибо за ваш ответ. Не могли бы вы рассказать о том, как я могу достичь этого, не нарушая URL. Любой пример кода будет высоко оценен. Благодарю. – PavanMysore

+0

Вы пробовали передать весь ответ TextUtils.HtmlEncode (строка); , а затем начать разбор – bhavindesai

+0

Просто попробуйте: введите свой InputSource вручную в ISO, например inputSource.setEncoding («UTF-8») или inputSource.setEncoding («ISO-8859-1»), а затем передайте его в синтаксический разбор SAX () – bhavindesai

1

Причина, по которой ваш синтаксический анализатор не может проанализировать этот XML-запрос, заключается в том, что он недействителен xml , Раздел данных, вызывающий вашу проблему, имеет символы, которые должны быть экранированы. См. Characters and escaping в статье wikipedia по XML для получения дополнительной информации.

Это лучше всего исправить в том, что производит xml, и самым простым решением было бы обернуть оскорбительный текст в CDATA section.

После того, как данные будут исправлены, вы также можете увидеть проблему, вызванную неправильным пониманием в вашем синтаксическом коде.

@Override 
public void characters(char[] ch, int start, int length) throws SAXException { 
    tempVal = new String(ch,start,length); 
} 

не всегда получите все символы между открывающим и закрывающим тегами, как контракт на этот метод позволяет ему назвать более чем один раз. Вместо простого копирования в строку вам нужно добавить в строковый буфер, который инициализируется в методе startElement и используется в методе endElement.

См. my answer to another SO question для получения дополнительной информации об этой проблеме characters.