Android中的SAX解析问题......空元素?

Posted

技术标签:

【中文标题】Android中的SAX解析问题......空元素?【英文标题】:SAX parsing problem in Android... empty elements? 【发布时间】:2010-12-29 14:38:41 【问题描述】:

我正在使用 SAX 解析我从网络上提取的 XML 文件。我已经扩展了DefaultHandler,代码类似于:

public class ArrivalHandler extends DefaultHandler     
    @Override
    public void startElement(String namespaceUri, String localName, String qualifiedName, Attributes attributes) throws SAXException 
        if (qualifiedName.equalsIgnoreCase("resultSet")) 
            System.out.println("got a resultset");
         else if (qualifiedName.equalsIgnoreCase("location")) 
            System.out.println("got a location");
         else if (qualifiedName.equalsIgnoreCase("arrival")) 
            System.out.println("got an arrival");
         else 
            System.out.println("There was an unknown XML element encountered: '" + qualifiedName + "'");
                
    

    @Override
    public void endElement(String namespaceUri, String localName, String qualifiedName) throws SAXException 
        // we'll just ignore this for now
    

    @Override
    public void characters(char[] chars, int startIndex, int length) throws SAXException 
        // ignore this too
    

我遇到的问题是我得到了一系列空元素。日志显示:

There was an unknown XML element encountered: ''
There was an unknown XML element encountered: ''
There was an unknown XML element encountered: ''
etc

当我只是传递 parser.parse 一个本地文件时,这工作正常,但现在我从网络上拉它:

HttpClient httpClient = new DefaultHttpClient();
resp = httpClient.execute("http://example.com/whatever");

SAXParserFactory saxFactory = SAXParserFactory.newInstance();
ArrivalHandler handler = new ArrivalHandler();
SAXParser parser = saxFactory.newSAXParser();
parser.parse(resp.getEntity().getContent(), handler);

我得到了上述(显然)空的结果。

到目前为止我所调查的内容:

    我将 InputStreamresp.getEntity().getContent() 转换为字符串并将其转储出来,看起来我从服务器获取 XML 是正确的。 没有抛出异常,但有一条警告显示为“W/ExpatReader(232): DTD handlers aren't supported.”。

关于我做错了什么或如何调试的任何其他想法?

【问题讨论】:

【参考方案1】:

来自docs for ContentHandler.startElement

限定名是必需的 命名空间前缀属性是 true,并且是可选的,当 命名空间前缀属性为假 (默认)。

那么,您是否将 namespace-prefixes 属性设置为 true

你能用 uri 和 localName 代替吗?

【讨论】:

哦。 localName 给了我想要的东西。我不明白为什么它在不同的上下文中以不同的方式返回它们(从本地读取与远程读取)。 我在使用 android 时也会发生同样的事情。它与“从网络上提取”无关。在我对库的 junit 测试中,它设置了qualifiedName。但是当我在 Android 项目中使用这个库时,它会设置 localName 而不是qualifiedName。不知道为什么:( @Jon Skeet - 你能解释一下如何将命名空间前缀属性设置为 true。

以上是关于Android中的SAX解析问题......空元素?的主要内容,如果未能解决你的问题,请参考以下文章

SAX XML 解析器抛出空指针异常

xml 使用 sax 解析器从子标签解析数据

android中XML SAX解析器、Pull解析器和DOM解析器的区别

Android之解析XML格式数据

SAX 的 characters() 方法未解析 Text 节点中的特殊字符

使用 SAX 解析常见的 XML 元素