Как разобрать только детей, где attribute = foo из xml, используя android.sax? - PullRequest
1 голос
/ 02 сентября 2011

У меня есть некоторые данные, хранящиеся в XML-файле, например:

<group name="example">
    <article name="foo">
        <content>Lorem ipsum dolor sit amet.</content>
        <link>
            <title>Lipsum</title>
            <url>http://www.lipsum.com/feed/html</url>
        </link>
    </article>
    <article name="bar">
        <content>Lorem ipsum dolor sit amet.</content>
        <link>
            <title>Google</title>
            <url>http://www.google.com</url>
        </link>
    </article>
</group>

Скажем, я хочу проанализировать конкретную статью, где name="foo" в Android.До сих пор я использовал пакет android.sax, но не могу понять, есть ли у него такая возможность.Или, если есть альтернативный способ сделать это, я буду признателен за помощь.

РЕДАКТИРОВАТЬ: Это код, который я до сих пор.Я чувствую, что что-то упустил.Проблема в том, что он добавляет информацию из ВСЕХ статей, а не только ту, которую я хочу.

public Article parse(final String articleTitle) {
    RootElement root = new RootElement("learning");

    Element group = root.getChild("group");

    final Element article = group.getChild("article");

    article.setStartElementListener(new StartElementListener() {

        @Override
        public void start(Attributes attributes) {
            if (attributes.getValue("name").equals(articleTitle)) {
                currentArticle = new Article();
                currentArticle.setTitle(articleTitle);
                setupArticle(currentArticle);
            }
        }

        private void setupArticle(final Article currentArticle) {

            article.getChild("content").setEndTextElementListener(
                    new EndTextElementListener() {

                        @Override
                        public void end(String body) {
                            currentArticle.setContent(body);
                        }

                    });


    Context context = Application.getAppContext();
    InputStream raw;

    try {
        raw = context.getAssets().open("learning_articles.xml");
        Xml.parse(raw, Xml.Encoding.UTF_8, root.getContentHandler());
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    return currentArticle;

Ответы [ 2 ]

0 голосов
/ 01 февраля 2013

Вы устанавливаете EndTextElementListener для <content> элементов в тот момент, когда синтаксический анализатор фактически анализирует родительский (<article>) элемент. Просто установите все прослушиватели перед вызовом метода Xml.parse() и добавьте условие каждому из них.

Я бы сказал так:

private static Article currentArticle;

public Article parse(final String articleTitle) {
RootElement root = new RootElement("learning");
Element group = root.getChild("group");
final Element article = group.getChild("article");

article.setStartElementListener(new StartElementListener() {

    @Override
    public void start(Attributes attributes) {
        if (attributes.getValue("name").equals(articleTitle)) {
            currentArticle = new Article();
            currentArticle.setTitle(articleTitle);
        } else {
            currentArticle = null;
        }
    }
});

article.getChild("content").setEndTextElementListener(
                new EndTextElementListener() {

     @Override
     public void end(String body) {
        if (currentArticle.getTitle().equals(articleTitle)) {
           currentArticle.setContent(body);
        }
     }

});

Context context = Application.getAppContext();
InputStream raw;

try {
    raw = context.getAssets().open("learning_articles.xml");
    Xml.parse(raw, Xml.Encoding.UTF_8, root.getContentHandler());
} catch (Exception e) {
    throw new RuntimeException(e);
}

return currentArticle;

Или, если вы хотите проанализировать несколько статей, добавьте currentArticle к List в конце элемента <article> и верните всю коллекцию вместо одного объекта.

0 голосов
/ 02 сентября 2011

Это не точный ответ, но когда я использую Groovy (который способен использовать саксофон), я сделал что-то похожее на то, что делается здесь:

Я лично не делал этого с Android, но, учитывая, что Android, Java и Groovy относительно похожи по синтаксису, найти ответ оттуда не составит большого труда!

Кстати, у него есть примеры как на Java, так и на Groovy;) (листинг 2 может быть там, где вы заинтересованы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...