Я использую SAX для анализа XML-файла, который я вынимаю из Интернета. Я продлил DefaultHandler с кодом аналогично:SAX синтаксическая проблема в Android ... пустые элементы?
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.
».
Любые другие идеи, что я делаю неправильно или как отлаживать это?
D'oh. 'localName' дал мне то, что я хотел. Я не понимаю, почему он возвращает их по-разному в разных контекстах (чтение из локального или удаленного). –
То же самое происходит со мной при использовании Android. Это не связано с «вытаскиванием его из Интернета». В моих тестах библиотеки junit он устанавливает квалифицированное имя. Но когда я использую эту библиотеку в проекте Android, она устанавливает localName вместо qualifiedName. Не знаю почему :( – gaizka
@Jon Skeet - Можете ли вы объяснить, как установить префикс пространства имен для true. – Sniper