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);
我得到了上述(显然)空的结果。
到目前为止我所调查的内容:
-
我将
InputStream
从 resp.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解析问题......空元素?的主要内容,如果未能解决你的问题,请参考以下文章
android中XML SAX解析器、Pull解析器和DOM解析器的区别