简单的XML解析器框架问题 - XML解析Android中
我在与Android应用解析XML的问题,一个问题here意味着有4种类型的XML解析机制建议: - SAX - DOM - XmlPullParser - 简单的XML框架简单的XML解析器框架问题 - XML解析Android中
虽然简单的框架是惊人的,我已经与它合作,当我发现它不能支持@Text和@Element在同一个类中时,我遇到了一个死胡同,这很糟糕,因为我可以不要改变我的XML方案。
所以想法是赞赏和任何建议将是伟大的。如果你想映射你的XML /从对象 http://code.google.com/p/xstream-for-android/
经过很长时间的研究,我发现最适合我需要的XML解析器是JAXB Parser。
- 支持复杂类型。
- 注解为导向。
- 适用于Android。
- 很容易理解。
- 用于生成JAXB注释类的工具已经存在于Java 1中。6+
一个例子来说明它是多么容易使用:
@XmlRootElement(name = "a")
public class A {
@XmlElementRefs({
@XmlElementRef(name = "lang", namespace = "http://www.w3.org/namespace/", type = Lang.class, required = false),
@XmlElementRef(name = "subst", namespace = "http://www.w3.org/namespace/", type = Subst.class, required = false),
@XmlElementRef(name = "include", namespace = "http://www.w3.org/namespace/", type = Include.class, required = false),
@XmlElementRef(name = "br", namespace = "http://www.w3.org/namespace/", type = Br.class, required = false),
@XmlElementRef(name = "kw", namespace = "http://www.w3.org/namespace/", type = Kw.class, required = false),
@XmlElementRef(name = "help", namespace = "http://www.w3.org/namespace/", type = Help.class, required = false)
})
@XmlMixed
protected List<Object> content;
@XmlAttribute(name = "cost")
protected String cost;
@XmlAttribute(name = "href", required = true)
protected String href;
@XmlAttribute(name = "key")
protected String key;
所以这是我想出了最好的。
任何添加,欢迎:)
XStream的是很容易(在Android上工作,没有依赖)。
它不是像Simple或JAXB那样的ORM库,而是专注于拉解析规范给予我们的最大解析性能,但是XPath的飞溅提供了易于定义的解析规则,而不是自己管理pull语法分析器的状态。
例如,您将针对在XML的某些元素与规则,像这样(这是我与它内置的RSS解析器为例):
IRule linkRule = new DefaultRule(Type.CHARACTER, "/rss/channel/item/link") {
@Override
public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
// 'text' is the link; store it, print it, whatever you need...
}
}
您可以定义任意数量的规则,并给他们到XMLParser(可重用)的一个实例,然后根据这些规则将它的InputStreams用于XML解析。
拉解析器的SJXP ontop的解析开销接近零(内存和CPU开销) - 它实际上相当于1次哈希代码计算,然后只是整数比较,看看是否有规则匹配XML解析器在运行内容时的当前位置。
它支持的属性和特征数据 - 图书馆甚至有通过使用[] -notation支持命名空间一个很好的和优雅的方式......例如:
IRule channelSubjectRule = new DefaultRule(Type.CHARACTER, "/rss/channel/[http://purl.org/dc/elements/1.1/]subject") {
@Override
public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
// Got the Channel's dc:subject value! I win!
}
}
库并不意味着是另一种神秘的抽象,隐藏你的一切;它的含义要低一点,但仍然高于STAX解析,而不会引入内存或CPU膨胀到嵌入式或高性能系统的解析过程(这是为在长时间运行的spidering过程中使用的feed解析器编写的) )。
感谢您的答复。 虽然你的建议很好,但我正在寻找面向Annotation的东西,因为这是我认为最适合我复杂的XML Schema的东西,因为它的关系非常细面条。 所以你可以请,如果你知道,给我提供一些注释导向。 –
穆罕默德,不幸的是,简单的XML是我对android和基于注释的工作的唯一建议。抱歉。 –