2009-12-23 3 views
2

Я использую 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); 

и я получаю (по-видимому) пустые результаты, описанные выше.

То, что я посмотрел в до сих пор:

  1. я преобразовал InputStream из resp.getEntity().getContent() в строку и сбрасывали ее, и она выглядит, как я получаю XML от сервера правильно.
  2. Исключены исключения, но есть предупреждение, которое гласит: «W/ExpatReader(232): DTD handlers aren't supported.».

Любые другие идеи, что я делаю неправильно или как отлаживать это?

ответ

3

Из docs for ContentHandler.startElement:

квалифицированное имя требуется, когда свойство пространства имен префиксов правда, и не является обязательным, когда пространства имен префиксов свойство является ложным (по умолчанию).

Итак, у вас есть свойство namespace-prefixes, установленное на true?

Можете ли вы просто справиться с uri и localName?

+1

D'oh. 'localName' дал мне то, что я хотел. Я не понимаю, почему он возвращает их по-разному в разных контекстах (чтение из локального или удаленного). –

+0

То же самое происходит со мной при использовании Android. Это не связано с «вытаскиванием его из Интернета». В моих тестах библиотеки junit он устанавливает квалифицированное имя. Но когда я использую эту библиотеку в проекте Android, она устанавливает localName вместо qualifiedName. Не знаю почему :( – gaizka

+0

@Jon Skeet - Можете ли вы объяснить, как установить префикс пространства имен для true. – Sniper

 Смежные вопросы

  • Нет связанных вопросов^_^