android - 在解析 xml 时,在一些以 read more 结尾的字行之后获取的不是完整数据

标签 android xml rss android-parser

我正在尝试解析这个:

this is xml file which I want to read

我在解析时得到以下信息。

title = 车间大都会 description = Workshop Metropolis groot succes Vlak voor de...阅读更多

阅读更多不是Description上的任何文字,您可能会在上面看到哪个xml标签? 我不明白为什么会这样。

代码如下:

///********************** XMLParsingExample.java **********************//

公共(public)类 XMLParsingExample 扩展 Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    try {

        /** Handling XML */
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();

///** 发送 URL 解析 XML 标签 */

        URL sourceUrl = new URL("http://192.168.0.30/ibis.rss");

        /** Create handler to handle XML Tags ( extends DefaultHandler ) */
        MyXMLHandler myXMLHandler = new MyXMLHandler();
        xr.setContentHandler(myXMLHandler);

        xr.parse(new InputSource(sourceUrl.openStream()));


    } catch (Exception e) {
        System.out.println("XML Pasing Excpetion = " + e);
    }

    /** Get result from MyXMLHandler SitlesList Object */
    sitesList = MyXMLHandler.sitesList;
    for (int i = 0; i < sitesList.getLat().size(); i++) {
        System.out.println("title = "+ sitesList.getLat().get(i).toString());
        System.out.println("description = "+ sitesList.getLong().get(i).toString());
    }

}


////MyXMLHandler


公共(public)类 MyXMLHandler 扩展了 DefaultHandler {

Boolean currentElement = false;
String currentValue = null;
public static SitesList sitesList = null;

public static SitesList getSitesList() {
    return sitesList;
}

public static void setSitesList(SitesList sitesList) {
    MyXMLHandler.sitesList = sitesList;
}

/** Called when tag starts ( ex:- <name>AndroidPeople</name> 
 * -- <name> )*/
@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {

    currentElement = true;

    if (localName.equals("channel"))
    {
        /** Start */ 
        sitesList = new SitesList();
    }
}

/** Called when tag closing ( ex:- <name>AndroidPeople</name> 
 * -- </name> )*/
@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {

    currentElement = false;

    /** set value */ 
    if (localName.equalsIgnoreCase("title"))
        sitesList.setLat(currentValue);
    else if (localName.equalsIgnoreCase("description"))
        sitesList.setLong(currentValue);
}

/** Called to get tag characters ( ex:- <name>AndroidPeople</name> 
 * -- to get AndroidPeople Character ) */
@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {

    if (currentElement) {
        //currentValue = StringEscapeUtils.unescapeHtml4(new String(ch, start, length).trim()); //new String(ch, start, length).trim()
        currentValue = new String(ch, start, length);
        currentElement = false;
    }

}


公共(public)类 SitesList {

/** Variables */
private ArrayList<String> mlat = new ArrayList<String>();
private ArrayList<String> mlong = new ArrayList<String>();
private ArrayList<String> mradiuslat = new ArrayList<String>();
private ArrayList<String> mradiuslong = new ArrayList<String>();
private ArrayList<String> minfo = new ArrayList<String>();
private ArrayList<String> msound = new ArrayList<String>();

/** In Setter method default it will return arraylist 
 *  change that to add  */

public ArrayList<String> getLat() {
    return mlat;
}

public void setLat(String lat) {
    this.mlat.add(lat);
}

public ArrayList<String> getLong() {
    return mlong;
}

public void setLong(String longs) {
    this.mlong.add(longs);
}

最佳答案

首先制作pojo类(你的all标签的getter setter方法)

要解析 [CData],请使用 sax 解析器。把你的链接。

public class XMlStorePrasing extends DefaultHandler{
    public ArrayList<StoreLocator> Locator = new ArrayList<StoreLocator>();
    private StoreLocator wrapper ;
    private String record  = "";    
    private Context context;

    public static Map<String, String> QAns = new LinkedHashMap<String, String>();

    public ArrayList<StoreLocator> parseData(Context context)
    {
        try {
            try
            {       
                this.context = context;     
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();



    URL url = new URL("your link");
                    sp.parse(url.openStream(), this);
            }
            catch (UnknownHostException e) {
                e.printStackTrace();
            }               
    } catch (Exception e ) {
        e.printStackTrace();
    }
    return Locator;

    }

    @Override
    public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
        record = "";
        if(localName.equalsIgnoreCase("Record"))
        {
            wrapper = new StoreLocator();
        }
    }

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


        if(localName.equalsIgnoreCase("store"))
        {
            wrapper.setStore(record);

        }
        else if(localName.equalsIgnoreCase("latitude"))
        {

            wrapper.setLatitude(record);


        }
        else if(localName.equalsIgnoreCase("longitude"))
        {

            wrapper.setLongitude(record);

        }
        else if(localName.equalsIgnoreCase("distance"))
        {
//          wrapper.setAnswerOptions(record);
            wrapper.setDistance(record);

        }
        else if(localName.equalsIgnoreCase("address"))
        {

            wrapper.setAddress(record);


        }
        else if(localName.equalsIgnoreCase("city"))
        {
//          wrapper.setAnswerOptions(record);
            wrapper.setCity(record);

        }
        else if(localName.equalsIgnoreCase("state"))
        {
            wrapper.setState(record);


        }
        else if(localName.equalsIgnoreCase("zip"))
        {           
            wrapper.setZip(record);     

        }

        else if(localName.equalsIgnoreCase("Record"))
        {           
            Locator.add(wrapper);   
        }

    }

    @Override
    public void characters(char[] ch, int start, int length)throws SAXException {

        record += String.valueOf(ch,start,length);


    }

从这个调用:

ArrayList<StoreLocator> ss = new ArrayList<StoreLocator>();

XMlStorePrasing prasing = new XMlStorePrasing();
        ss = prasing.parseData(getApplicationContext()); 

我想这对你有帮助。

关于android - 在解析 xml 时,在一些以 read more 结尾的字行之后获取的不是完整数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7499620/

相关文章:

c# - 使用 C#(或任何其他方法)将 XML 转换为 SQL Server 表

c# - 在 C# 中从 Web 检索匿名类型

rss - 过滤 RSS 提要

java - 使用 Java 阅读更多 RSS 提要

android - 如何检测 NotificationManager 发送的通知的发送者/检测点击了通知栏上的哪个通知?

Android:如何从 GPS 获取最准确的位置

c# - 在 Unity 上安装 Firebase 时,出现错误 "Unloading broken assembly"

android - 在字符串中查找电话号码

c# - 将嵌套 XML 转换为 3d 数组

iPhone NSXMLParser(错误 9)