2009-11-12 13 views
29

XML(Androidアプリの場合)を解析する方法を解明しようとしていますが、Javaでどれほど難しいのかはかなりばかげているようです。さまざまなコールバック(startElement、endElementなど)を持つXMLハンドラを作成する必要があるようで、このデータをすべてオブジェクトに変更する必要があります。 this tutorialのようなものです。JavaでXMLを解析する簡単な方法はありますか?

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

+0

を可能にするDOMの上に余分な層である。この
http://xml.jcabi.com/
を試すことができます。 – brimborium

+0

(小)XML構成ファイルの解析のみに興味がある場合は、[XPath](http://www.ibm.com/developerworks/library/x-javaxpathapi/index.html)を参照することをお勧めします。私は通常、非常に簡単にアクセスできるので、それを使用します。あなたが大規模なXMLファイルで作業している場合、パフォーマンスは悪化します。 – brimborium

答えて

21

XMLには2種類のJava用プロセッサがあります(実際には3種類ありますが、1種類は奇妙です)。あなたが持っているものはSAXパーサーであり、あなたが望むものはDOMパーサーです。 DOMパーサの使い方については、http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser /をご覧ください。 DOMは簡単にナビゲートできるツリーを作成します。 SAXは大規模なドキュメントに最適ですが、DOMの方がはるかに簡単です。

+0

セカンドは何ですか?私はSAXとDOMだけに精通しています。 –

+0

StAXは奇妙なものです。 –

+4

プルパーサーについて何が奇妙ですか? – jitter

12

AndroidでXMLを処理する方法については、この記事を参照してください。たぶんDOMまたはXMLプルスタイルのJava 5/wを開始し、より良いあなたのスタイルに合わせて

Working with XML on Android

+0

はい、xmlpullparserはアンドロイド(ビルトイン、ストリーミング)に進む方法です。あなたの頭を包み込むのにちょっと時間がかかります。 – yanchenko

+0

プルパーサーの場合+1 - DOMよりも速く、SAXよりも定型句が少ない。 – gustafc

+1

XmlPullParser ++私はあまりにも強烈なサックスを立てることはできません! – RandomNickName42

2

は、XPathのライブラリは、SDKにあります。その概要については、this tutorialを参照してください。

-2

よくXMLを解析するのは簡単な作業ではありません。

基本構造は、より多くのツリーの配列からなるコンテナを保持できるツリー内のノードを持つツリーです。

ツリー内の各ノードにはタグと値が含まれますが、addtionには任意の数の名前付き属性と任意の数の子またはコンテナを含めることができます。

XML解析タスクは3つのカテゴリに分類される傾向があります。

「正規表現」でできること。例えば。最初の "MailTo"タグの値を探したいし、他のタグの内容には興味がありません。

自分で解析できること。 xml構造は、ルートノードと、単純な値を持つよく知られた10個のタグなど、常に非常に単純です。

残りすべて!たとえxmlメッセージ形式が見た目に紛らわしくても、家庭で作られたパーサーは、余分な属性、CDATA、予期しない子どもたちによって混乱することがあります。フルブローXMLパーサは、これらの状況をすべて処理できます。ここでの基本的な選択は、ストリームまたはDOMパーサーの間です。あなたがそれらを使用する順序で与えられたエンティティ/属性の大部分を使用するつもりなら、DOMパーサが理想的です。いくつかの属性にしか興味がなく、提示された順序で使用するつもりならば、パフォーマンスの制約がある場合、またはxmlファイルが大きい場合(> 500MB)、ストリームパーサーよりも大きい場合は、コールバックの仕組みは少し "groking"が必要ですが、実際には簡単にプログラムを作成することができます。私た内容に応じて、

+1

「シンプルな」ケースのためにregexpsや自家製のXMLパーサを使うべきであることを真剣に提案していますか? -1 – gustafc

+0

パフォーマンスが大きな要因だった場合を除いて、実際にはそれを推奨しませんでした。たとえば、顧客番号に基づいてロードバランシングを行った場合、完全なモンスターXMLパーサーを起動するのではなく、最初のCustNoタグをスキャンするだけで意味があります。 –

+1

Jamesは正規表現エンジンを使用して文字列を式に照合するのは、XML解析のようなレキシングベースのアプローチよりもはるかに高価です。特に、高速プルパーサーまたはSAXパーサーを使用しています。 私はこれをあなたに「投稿」しません。実際に大規模なスケーラブルなアプリケーションへの正規表現のアプローチを実際に展開している場合には、それを変更することができます。 –

2

は、あなたがSAXパーサーを使用する必要がありますので: - 高速 - あなたは

あなたがコーディングに多くの時間を支払うことになるXMLドキュメント内のすべてをコントロールすることができますが、解析するコードテンプレートを作成しますので、それは一度ですXML

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

幸運を祈る!

0

Castorを使用して、XMLをJava Beanにマップすることもできます。私は以前それを使用しており、それは魅力のように動作します。

+0

このサイトのリンクを見つけることはできません。これで少し助けてください。 –

0

書くことSAX handlerが最適です。そして一度それをしたら、決して他のものに戻ることはありません。それは速くて、シンプルで、それが行くにつれて砕けます。大部分を吸ったり、神がメモリ全体にDOMを禁じたりすることはありません。

13

http://simple.sourceforge.net、そのXML to Javaのシリアライズとバインディングフレームワーク、Androidと完全に互換性があり、非常に軽量で、270Kおよび依存性はありません。

+0

これは、より多くのupvotes人々を得る必要があります、これは本当にAndroidでXMLを操作するための最良の方法です。これを使って。 Androidプロジェクトに組み込む方法がわからない場合は、このブログの記事をご覧ください:http://massaioli.homelinux.com/wordpress/2011/04/21/simple-xml-in-android-1-5 -and-up/ –

+0

これは、GsonがjavaのJsonとほぼ同じです! :D素敵な図書館! – Skela

+0

あなたはそれが依存関係がないと確信していますか? mavenからシンプルを追加したとき、xpp、stax、stax-apiがhttp://i.imgur.com/T3h7Pb1.pngに表示されました。 –

0

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

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

私の意見では、XPath for parsing XMLを使用するのが最も簡単なコーディング手法かもしれません。ドキュメントのオブジェクトグラフをトラバースするコードを記述するのではなく、XMLドキュメントのノードを1つの式でプルするロジックを実装できます。

XPathを使用して既に提案されているanother posted answer to this questionです。 まだあなたのAndroidプロジェクトではありません。現在のところのXPath解析クラスは、Androidリリースではまだサポートされていません(Dalvik JVMでjavax.xml名前空間が定義されていても、あなたを騙してしまうかもしれません。

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

別のオプション(。それはあなたは、Java仮想マシンは、AndroidのDalvik VMにはまだ含まれているほとんどでサポートされている事を前提とすることはできません迷惑です)、 Googleの正式なサポートを待っている間は、現在のところDalvik VMとの互換性とXPathサポート(ベータ版)を主張しているJDOMです。 (私はこれをチェックアウトしていない、私は自分のウェブサイトから現在の主張を繰り返すに過ぎない)

1

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

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

3

カイル、

(この記事の自己promoteyな性質を許しなさい...私は数ヶ月のために、このライブラリーに取り組んできた、それはすべてオープンソースです/ Apache 2は、自己解決的ではなく、ただ助けようとしています)。

は、私はちょうど私がSJXPまたは「単純なJava XMLパーサを」呼んでいるライブラリをリリースしhttp://www.thebuzzmedia.com/software/simple-java-xml-parser-sjxp/

それはどんな仕様に準拠XMLの上に座って非常に小さい/タイト(4クラス)抽象化レイヤである パーサーを引く。

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

SJXPあなたは要素の文書でXPathのような「パス」を定義することができますされないか、値のような、よりたい属性:

/RSS /チャネル/タイトル

をし、それが意志そのルールが一致したときに値とともにコールバックを呼び出します。 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/)。その 'language'要素に固有の名前空間URIを 'dc'という接頭辞を付けて使用すると、ルールパスは次のようになります。

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

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

構文解析プロセスに追加するオーバーヘッドは、XMLドキュメントの各場所でのO(1)ハッシュ検索と、XML文書の各場所での数百バイト(おそらく1k)です。パーサ。

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

このライブラリは、すべての言語でフィードXMLのあらゆる種類のカスタムプルパーサーを作成し、(実際には)この実際の基本的なパラダイムに分解する約90%の構文解析を実現した結果です。

私はあなたが便利だと思います。

0

XmlPullParserには、あらゆる種類のxmlの非常に良い例があります。それはまた、一般的な方法として解析することができます、あなたはそのクラスを取得し、あなたのアンドロイドプロジェクトに入れて何かを変更する必要はありません。

Generic XmlPullParser

1

あなたはそれがあなたの最初のリンクが壊れている簡単な構文解析、印刷、およびXML文書とノードの変換

+0

注意してください。それは多くの依存性を持ち、私の春のブートアプリケーションはクラスパスで何かが検出されたので起動できませんでした(このlibのみが追加されました) – takacsot

関連する問題