Почему Sax Parser не находит никаких элементов?

У меня уйма времени на отладку классов-оболочек Android Sax. Мой вопрос в 2 раза. 1. Как вы выполняете отладку с помощью классов-оболочек Android Sax? 2. Что я здесь делаю не так?

У меня есть базовая программа для чтения RSS, которая отлично работает. Я пытаюсь создать программу чтения в формате Atom. У меня есть следующий код.

    private List<Message> parseAtom()
    {
        final Message currentMessage = new Message();
        final List<Message> messages = new ArrayList<Message>();

        RootElement root = new RootElement("http://www.w3.org/2005/Atom", ATOM);
        Element title = root.getChild(TITLE);
        Element item = root.getChild(ENTRY);


        title.setEndTextElementListener(new EndTextElementListener() {

            public void end(String body)
            {
                Log.d("title", body);
            }
        });



        item.setEndElementListener(new EndElementListener() {
            public void end()
            {
                if (currentMessage.getAttribution() == null || currentMessage.getAttribution().length() == 0) currentMessage.setAttribution(Attribution);

                messages.add(currentMessage.copy());
            }
        });
        item.getChild(TITLE).setEndTextElementListener(new EndTextElementListener() {
            public void end(String body)
            {
                currentMessage.setTitle(body);
            }
        });
        item.getChild(ID).setEndTextElementListener(new EndTextElementListener() {
            public void end(String body)
            {
                currentMessage.setLink(body);
            }
        });
        item.getChild(SUMMARY).setEndTextElementListener(new EndTextElementListener() {
            public void end(String body)
            {
                currentMessage.setDescription(body);
            }
        });
        item.getChild(UPDATED).setEndTextElementListener(new EndTextElementListener() {
            public void end(String body)
            {
                currentMessage.setDate(body);
            }
        });


        item.getChild(Author).getChild(NAME).setEndTextElementListener(new EndTextElementListener() {
            public void end(String body)
            {
                currentMessage.setAttribution(body);
            }
        });



        try
        {
            String content = this.getInput();
            Xml.parse(content, root.getContentHandler());

            //Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler());
        }
        catch (Exception e)
        {
            throw new RuntimeException(e);
        }
        return messages;



    }

Константы в вызовах getChild() определены в базовом классе как:

static final String CHANNEL = "channel";
static final String PUB_DATE = "pubDate";
static final String DESCRIPTION = "description";
static final String LINK = "link";
static final String TITLE = "title";
static final String ITEM = "item";
static final String Author = "author";

static final String ENTRY = "entry";
static final String SUMMARY = "summary";
static final String ID = "id";
static final String UPDATED = "updated";
static final String NAME = "name";

Фид, который я использовал в качестве примера, выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>NFL.com</title>
  <link rel="alternate" href="http://www.nfl.com/rss/rsslanding" />
  <link rel="self" href="http://www.nfl.com/rss/rsslanding" />
  <subtitle>Latest news from NFL.com for Atlanta Falcons</subtitle>
  <id>http://www.nfl.com/rss/rsslanding</id>
  <rights>© 2012 NFL Enterprises LLC</rights>
  <updated>2012-09-13T03:01:04Z</updated>
  <dc:date>2012-09-13T03:01:04Z</dc:date>
  <dc:rights>© 2012 NFL Enterprises LLC</dc:rights>
  <entry>
    <title>Brent Grimes to injured reserve with Achilles injury</title>
    <link rel="alternate" href="http://www.nfl.com/goto?id=0ap1000000060448" />
    <author>
      <name>Hanzus, Dan</name>
    </author>
    <id>http://www.nfl.com/goto?id=0ap1000000060448</id>
    <updated>2012-09-11T00:38:35Z</updated>
    <published>2012-09-10T18:50:00Z</published>
    <summary type="text">The Atlanta Falcons suffered a potentially devastating blow Monday with the news that cornerback Brent Grimes has played his last game of 2012. Who will step up in his absence?</summary>
    <dc:creator>Hanzus, Dan</dc:creator>
    <dc:date>2012-09-10T18:50:00Z</dc:date>
  </entry>
</feed>

Когда это запускается, Xml.parse(content, root.getContentHandler()); возвращается, ничего не делая. Он не создает исключение. Но ни один из Listeners никогда не срабатывал (проверено через контрольные точки). Парсер ничего не бросает в logcat.

Я добавил title к корневому элементу, чтобы посмотреть, смогу ли я это сделать, но не пошел.

Первоначально у меня была проблема с синтаксическим анализатором, выдающим ошибку из-за отсутствия пространства имен (соответствовало feed, ему было дано http://www.w3.org/2005/Atom:feed из документа xml...вызванная ошибка). После добавления пространства имен он больше не выдает ошибку, но, похоже, ничего не делает.

Это моя первая попытка использовать обертки SAX (или, если уж на то пошло, sax). Я пропустил что-то простое?


person Michael Stoner    schedule 13.09.2012    source источник


Ответы (1)


Недавно я столкнулся с этой же проблемой, когда пытался проанализировать некоторый XML с помощью этого метода, и мне потребовалось некоторое время, чтобы понять это, но проблема заключалась в том, что я упускал пространство имен в дочернем поиске. Итак, в вашем ридере вместо

Element title = root.getChild(TITLE);

использовать

Element title = root.getChild(NAMESPACE, TITLE);

Вам придется делать это каждый раз, когда вы используете getChild() в своем ридере.

person StackJP    schedule 19.09.2012
comment
Ах идеально! Спасибо вам за помощь. - person Michael Stoner; 22.09.2012