it-swarm-ja.tech

JavaでXMLを解析する簡単な方法はありますか?

(Androidアプリの場合)一部のXMLを解析する方法を理解しようとしていますが、Javaで実行するのがいかに難しいかがおかしいようです。XMLを作成する必要があるようですさまざまなコールバック(startElement、endElementなど)を持つハンドラーで、このデータをすべてオブジェクトに変更する必要があります このチュートリアル のようなもの。

私が本当に必要なのは、XMLドキュメントを多次元配列に変更することだけです。さらに、ある種の Hpricot プロセッサを用意することをお勧めします。これを行う方法はありますか、または上記の例のすべての追加コードを実際に記述する必要がありますか?

33
Kyle Slattery

Java(実際には3つですが、1つは奇妙です)には、XML用の2つの異なるタイプのプロセッサがあります。SAXパーサーとDOMパーサーがあります。 http://www.mkyong.com/Java/how-to-read-xml-file-in-Java-dom-parser /DOMパーサーの使用方法。DOMはツリーを作成します大きなドキュメントにはSAXが最適ですが、低速でメモリを大量に消費する場合はDOMの方がはるかに簡単です。

24
stimms

試してみてください http://simple.sourceforge.net 、そのXMLはJavaシリアライゼーションおよびバインディングフレームワーク、Androidとの完全な互換性=非常に軽量で、270Kで依存関係はありません。

13
ng.

AndroidでXMLを処理する方法については、この記事を確認してください。多分DOMまたはXMLのプルスタイルはあなたのスタイルによりよく適合します

AndroidでのXMLの使用

12
jitter

カイル、

(この投稿の自己宣伝の性質を許しなさい...私は何ヶ月もの間このライブラリに取り組んできました、そしてそれはすべてオープンソース/ Apache 2なので、自己奉仕ではなく、ただ助けようとしています)。

SJXPまたは "Simple Java XML Parser"と呼んでいるライブラリをリリースしました http://www.thebuzzmedia.com/software/simple-Java-xml-parser- sjxp /

これは、仕様に準拠したXMLプルパーサーの上に配置される非常に小さい/タイトな(4クラス)抽象化レイヤーです。

AndroidおよびAndroid以外のJavaプラットフォームでは、プル解析はおそらく最も高速な(速度とメモリオーバーヘッドが低い)解析方法の1つです。残念ながら、プルパーサーに対して直接コーディングすると、他のXML解析コード(SAXなど)とよく似たものになります-例外ハンドラーがあり、パーサーの状態、エラーチェック、イベント処理、値の解析などを維持します。

SJXPが行うことは、次のように、値を取得する要素または属性のドキュメントでXPathのような「パス」を定義できるようにすることです。

/ rss/channel/title

そして、そのルールが一致すると、値を使用してコールバックを呼び出します。 APIは非常に単純で、パースしようとしている名前空間修飾要素が直感的にサポートされています。

標準パーサーのコードは次のようになります(RSS2フィードのタイトルを解析する例):

IRule titleRule = new DefaultRule(Type.CHARACTER, "/rss/channel/title") {
@Override
public void handleParsedCharacters(XMLParser parser, String text) {
    // Store the title in a DB or something fancy
}}

次に、XMLParserインスタンスを作成し、それに必要なすべてのルールを与えます。

XMLParser parser = new XMLParser(titleRule);
parser.parse(xmlStream);

ルールが一致するたびに、パーサーはハンドラーメソッドを呼び出します。必要に応じてparser.stop()を呼び出すことで、いつでも解析を停止できます。

さらに(これがこのライブラリの本当の利点です)、名前空間修飾された要素と属性を一致させるのは非常に簡単です。パス内の要素の名前の前に角かっこ内に名前空間URIを追加するだけです。

例として、RSSフィードの要素から除外して、それがどの言語であるかがわかるようにするとします(ref: http://web.resource.org/rss/1.0/modules/dc/ =)。接頭辞が「dc」の「language」要素に一意の名前空間URIを使用するだけで、ルールパスは次のようになります。

/rss/channel/[http://purl.org/dc/elements/1.1/]language

名前空間で修飾された属性についても同様です。

そのすべての容易さで、解析プロセスに追加する唯一のオーバーヘッドは、XMLドキュメントの各場所でのO(1)ハッシュルックアップと、数百バイト、おそらく1kのパーサーの内部位置の状態。

ライブラリはAndroid追加の依存関係なしで動作します(プラットフォームはorg.xmlpull implをすでに提供しているため)および他のJavaランタイムでXPP3依存関係を追加することで。

このライブラリは、あらゆる言語であらゆる種類のフィードXML用のカスタムプルパーサーを何カ月も作成し、解析の約90%がこの本当に基本的なパラダイムに蒸留できることを(時間とともに)実現した結果です。

重宝すると思います。

3
Riyad Kalla

私によると、次の理由でSAXパーサーを使用する必要があります。-高速-XMLドキュメントのすべてを制御できる

コーディングにより多くの時間を費やすことになりますが、XMLを解析するためのコードテンプレートを作成するので、これは一度です

2番目のケースからは、変更内容のみを編集します。

幸運を!

2
misamap

Java 5以降、SDKにはXPathライブラリがあります。概要については このチュートリアル を参照してください。

2
Hank Gay

あなたはこれを試すことができます
http://xml.jcabi.com/
これは、DOMの上にある追加のレイヤーであり、XMLドキュメントとノードの簡単な解析、印刷、変換を可能にします

1
George

私の意見では、 XMLを解析するためのXPath を使用するのが最も簡単なコーディング方法かもしれません。ドキュメントのオブジェクトグラフをトラバースするコードを記述する必要はなく、XMLドキュメントからノードをプルするロジックを単一の式で具体化できます。

私は この質問に対する別の投稿された回答 がXPathの使用をすでに提案していることに注意します。 しかし、まだAndroid projectには対応していません。)現在、XPath解析クラスはまだ対応していませんすべてのAndroid releaseでサポートされています(Dalvik JVMでjavax.xml名前空間が定義されている場合でも、最初に私が行ったように、だまされる可能性があります) 。

AndroidにXPathクラスを含めることは、後期段階の現在の作業項目です(これは、私がこれを書いているときに、Googleによってテストおよびデバッグされています。)できます XPathをDavlikに追加するステータスをここで追跡しますhttp://code.google.com/p/Android/issues/detail?id=515

(ほとんどのJava VMはまだAndroid Dalvik VMに含まれています)でサポートされているものと想定できないのは不快です。)

Googleの公式サポートを待っている間の別のオプションは [〜#〜] jdom [〜#〜] で、現在Dalvik VM互換性とXPathサポート(ベータ版)(私はこれをチェックしていません。彼らのWebサイトから現在の主張を繰り返しています。)

1
M.Bearden

私はこの問題を正確に解決するために本当にシンプルなAPIを作成しました。これは、コードベースに含めることができる単一のクラスであり、XMLを解析するのは本当にクリーンで簡単です。あなたはそれをここで見つけることができます:

http://argonrain.wordpress.com/2009/10/27/000/

1
Chris

あらゆるタイプのxmlのXmlPullParserの非常に良い例が示されています。それは一般的な方法として解析することもできます。そのクラスを取得してAndroidプロジェクトに入れるだけで、変更する必要はありません。

ジェネリックXmlPullParser

0
Samdrain

Castor を使用してXMLをJava Beansにマップすることもできます。以前に使用したことがあり、チャームのように機能します。

0
Rahul

数週間前、私は小さなライブラリ(javax.xml.stream.XMLEventReaderのラッパー)をボロボロにし、手書きの再帰降下パーサーと同様の方法でXMLを解析できるようにしました。ソースは githubで利用可能 で、簡単な使用例を以下に示します。残念ながらAndroidはこのAPIをサポートしていませんが、サポートされているXmlPullParser AP​​Iと非常によく似ており、移植に時間がかかりません。

accept("tilesets");
    while (atTag("tileset")) {
        String filename = attrib("file");
        File tilesetFile = new File(filename);
        if (!tilesetFile.isAbsolute()) {
            tilesetFile = new File(FilenameUtils.concat(file.getParent(), filename));
        }
        int tilesize = Integer.valueOf(attrib("tilesize"));
        Tileset t = new Tileset(tilesetFile, tilesize);
        t.setID(attrib("id"));
        tilesets.add(t);

        accept();
        close();
    }
close();

expect("map");

int width       = Integer.valueOf(attrib("width"));
int height      = Integer.valueOf(attrib("height"));
int tilesize    = Integer.valueOf(attrib("tilesize"));
0
jaz303

SAX handlerが最善の方法です。そして、あなたがそれをしたら、あなたは決して何にも戻らないでしょう。それは高速でシンプルであり、それが進むにつれてクランチします。大きな部分を吸い込んだり、神がDOM全体をメモリに禁止したりすることはありません。

0
Bostone