如何使用android.sax解析xml中属性= foo的子节点?

时间:2011-09-01 21:06:52

标签: android xml xml-parsing sax

我有一些数据存储在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>

说我要解析android中name="foo"的具体文章。到目前为止我一直在使用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 :(得分:0)

这不是一个确切的答案,但是当我使用Groovy(能够使用sax)时,我做了类似于这里所做的事情:

我没有亲自用Android做过,但是看看Android,Java和Groovy在语法上的相似程度,从那里找到你的答案应该不会太难!

顺便说一下,它在Java和Groovy中都有示例;)(清单2可能是你感兴趣的地方)

答案 1 :(得分:0)

在解析器实际解析父(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>并返回整个集合而不是仅返回一个对象。