我正在使用sax解析从web上提取的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本地文件时,这个方法运行得很好,但现在我要从web上提取它:
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.”。
对于我错误的操作或如何调试有什么其他想法吗?

最佳答案

docs for ContentHandler.startElement开始:
在以下情况下需要限定名
命名空间前缀属性是
是,并且在
命名空间前缀属性为false
(默认值)。
那么,是否将namespace prefixes属性设置为true
你能不能只处理uri和localname?

09-26 08:52