【问题标题】:SAXParser throws org.apache.harmony.xml.ExpatParser$ParseExceptionSAXParser 抛出 org.apache.harmony.xml.ExpatParser$ParseException
【发布时间】:2011-05-17 08:25:21
【问题描述】:

当我尝试在 android 中使用 SAXParser 解析 xml 时。最后一个“>”将不起作用。总是显示错误:

org.apache.harmony.xml.ExpatParser$ParseException: At line 15, column 12: not well-formed (invalid token)

这是我的 xml 文件:

<?xml version="1.0" encoding="utf-8"?> 
<magazines> 
<magazine id="176"> 
<publising>1</publising> 
<price>0</price> 
<paid_state>True</paid_state> 
<cover_img>http://172.23.5.222/files/images/pub/issue/image-20110517-10bcmaka9bklah8ph57o.jpg</cover_img> 
</magazine> 
<magazine id="175"> 
<publising>1</publising> 
<price>0</price> 
<paid_state>True</paid_state> 
<cover_img>http://172.23.5.222/files/images/pub/issue/image-20110517-9jqtrfo5lozztb7m5xlu.jpg</cover_img> 
</magazine> 
</magazines>

这是我的处理程序

public class BKXMLCoverContentHandler extends DefaultHandler  {

private String TAG = "BKXMLCoverContentHandler";

private TreeMap<Integer, Magazine> magazines;
private Magazine magazine;

private String tempString;

private static final String MAGAZINES = "magazines";
private static final String MAGAZINE = "magazine";
private static final String ID = "id";
private static final String PUBLISHING = "publising";
private static final String PRICE = "price";
private static final String PAID_STATE = "paid_state";
private static final String COVER_IMG = "cover_img";

public TreeMap<Integer, Magazine> getMagazines() {
    return magazines;
}


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

    if (magazine != null) {
        String valueString = new String(ch, start, length);
        if (PUBLISHING.equals(tempString)) {
            Log.d(TAG, valueString);
            magazine.setPublishingStatus(valueString);
        } else if (PRICE.equals(tempString)) {
            Log.d(TAG, valueString);
            magazine.setPrice(valueString);
        } else if (PAID_STATE.equals(tempString)){
            Log.d(TAG, valueString);
            magazine.setPaidStatus(tempString);
        } else if (COVER_IMG.equals(tempString)){
            Log.d(TAG, valueString);
            magazine.setCoverUrl(valueString);
        } 
    } 
}

@Override
public void startElement(String uri, String localName, String name,
        Attributes attributes) throws SAXException {
    if (MAGAZINES.equals(localName)){
        Log.d(TAG, localName);
        magazines = new TreeMap<Integer, Magazine>();
    }

    if (MAGAZINE.equals(localName)) {

        magazine = new Magazine();
        Log.d(TAG, localName);
        magazine.setId(new Integer(attributes.getValue(ID)));
    } 
    tempString = localName;
}

@Override
public void endElement(String uri, String localName, String name)
        throws SAXException {
        if(MAGAZINE.equals(localName) && magazine != null){
            Log.d(TAG, localName);
            magazines.put(magazine.getId(), magazine);
            magazine = null;
        } else if(MAGAZINES.equals(localName)){
            Log.d(TAG, localName);
        }
        tempString = null;
}

}

从代码中你可以看到我记录了每一行的生产。所以我得到了一个日志输出:

D/BKXMLCoverContentHandler(  980): magazines
D/BKXMLCoverContentHandler(  980): magazine
D/BKXMLCoverContentHandler(  980): 1
D/BKXMLCoverContentHandler(  980): 0
D/BKXMLCoverContentHandler(  980): True
D/BKXMLCoverContentHandler(  980): http://172.23.5.222/files/images/pub/issue/image-20110517-10bcmaka9bklah8ph57o.jpg
D/BKXMLCoverContentHandler(  980): magazine
D/BKXMLCoverContentHandler(  980): magazine
D/BKXMLCoverContentHandler(  980): 1
D/BKXMLCoverContentHandler(  980): 0
D/BKXMLCoverContentHandler(  980): True
D/BKXMLCoverContentHandler(  980): http://172.23.5.222/files/images/pub/issue/image-20110517-9jqtrfo5lozztb7m5xlu.jpg
D/BKXMLCoverContentHandler(  980): magazine
D/BKXMLCoverContentHandler(  980): magazines

谁能告诉我这是怎么回事?

【问题讨论】:

  • ae 您好,您是如何阅读这些 xml 内容的,我的意思是您是通过调用任何 url 来阅读它,还是只是在设备上解析本地 xml 文件。请确认。

标签: android saxparser


【解决方案1】:

问题已解决。

我从 url 读取 xml 并将其写入我的 android 设备 sdcard。当它写入时,我每次使用缓冲区读取 8 * 1024 字节。 xml 对于 8k 来说太短了,所以程序用空白 util 填充文件得到 8k 字节。这会导致问题。

【讨论】:

  • 您的下一个问题将是您假设开始和结束标记之间的所有字符数据都在对字符的单个调用中传递,但在 sax 解析器中,这不一定是真的,它可以分解为多个调用。
猜你喜欢
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2014-01-09
  • 1970-01-01
相关资源
最近更新 更多