2012-05-17 188 views
2

我在与Android应用解析XML的问题,一个问题here意味着有4种类型的XML解析机制建议: - SAX - DOM - XmlPullParser - 简单的XML框架简单的XML解析器框架问题 - XML解析Android中

虽然简单的框架是惊人的,我已经与它合作,当我发现它不能支持@Text和@Element在同一个类中时,我遇到了一个死胡同,这很糟糕,因为我可以不要改变我的XML方案。

所以想法是赞赏和任何建议将是伟大的。如果你想映射你的XML /从对象 http://code.google.com/p/xstream-for-android/

回答

3

经过很长时间的研究,我发现最适合我需要的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; 

所以这是我想出了最好的。


任何添加,欢迎:)

1

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解析器编写的) )。

4

SJXP是建成在STAX拉解析规范上很薄的一层高性能库

+0

感谢您的答复。 虽然你的建议很好,但我正在寻找面向Annotation的东西,因为这是我认为最适合我复杂的XML Schema的东西,因为它的关系非常细面条。 所以你可以请,如果你知道,给我提供一些注释导向。 –

+0

穆罕默德,不幸的是,简单的XML是我对android和基于注释的工作的唯一建议。抱歉。 –