我有一些数据存储在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;
答案 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>
并返回整个集合而不是仅返回一个对象。