2

AndroidアプリでのXMLの解析に問題があります。ここでの質問は、4種類のXML解析メカニズムが推奨されていることを意味します。-SAX-DOM-XmlPullParser-Simple XML Framework

Simple Frameworkは素晴らしく、すでに使用していましたが、同じクラスで@Textと@Elementをサポートできないことがわかったとき、行き止まりになりました。これは、XMLスキームを変更できないためです。

したがって、アイデアは高く評価され、アドバイスは素晴らしいものになります。

4

4 に答える 4

4

SJXPは、STAXプル解析仕様の上に非常に薄いレイヤーとして構築された高性能ライブラリです(依存関係のないAndroidで動作します)。

SimpleやJAXBのようなORMライブラリではなく、プル解析仕様によって提供される最大の解析パフォーマンスに焦点を当てていますが、プルパーサーを管理する代わりに、XPathをスプラッシュして定義しやすい解析ルールを提供します。自分自身を述べなさい。

たとえば、次のようなルールを使用して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のインスタンス(再利用可能)に渡してから、XMLのInputStreamsを渡して、それらのルールに従って解析します。

プルパーサー上でのSJXPの解析オーバーヘッドはほぼゼロです(メモリとCPUの両方のオーバーヘッド)-文字通り1回のハッシュコード計算に相当し、整数比較を行って、ルールが現在の位置に一致するかどうかを確認します。コンテンツを実行している間のXMLパーサー。

属性と文字データをサポートします。ライブラリには、[]-表記法を使用して名前空間をサポートする優れたエレガントな方法もあります。例:

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!
    }
}

ライブラリは、すべてをあなたから隠す別の魔法の抽象化を意図したものではありませんでした。それよりも少し低いレベルですが、組み込みシステムまたは高性能システムの解析プロセスにメモリやCPUの肥大化をもたらすことなく、STAXの直接解析よりも高いレベルです(長時間実行されるスパイダリングプロセスで使用されるフィードパーサー用に作成されています) )。

于 2012-05-20T14:52:03.217 に答える
3

Well after researching for a long time I found the best XML parser suited to my needs was the JAXB Parser.

  • Supports complex types.
  • Annotation Oriented.
  • Works well with Android.
  • Very easy to understand.
  • Tools to generate JAXB annotated classes already exists in Java 1.6+

An Example to show how easy it is to use:

@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;

So that was the best I came up with.


Any additions are welcome :)

于 2012-09-11T07:21:56.340 に答える
1

xmlをオブジェクトに/からマップしたい場合、xstreamは非常に簡単です http://code.google.com/p/xstream-for-android/

于 2012-05-17T12:51:03.520 に答える
0

You can use Konsume-XML: it's based on Stax/pull but it's higher level and easier to use. It doesn't map stuff to objects by default but it can be easily used to do so. Please see more examples at the Konsume-XML page.

于 2019-04-12T17:24:54.230 に答える