2012-05-17 102 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和基於註釋的工作的唯一建議。抱歉。 –