2012-02-16 25 views
-1

xmlドキュメントを読むための助けが必要です。JAVA、XML解析

XMLのようなものである

を、私はクラスの人を持って、私はそのXMLからリストを作成したい:私は、DOMパーサー(org.w3c.domの)

を使用してい

<root> 
<field1></field1> 
<field2></field1> 
<field3></field1> 
<Persons> 
<id></id> 
<List> 
<Person> 
<Name>...</Name> 
<LastName>...</LastName> 
</Person> 
<Person> 
<Name>...</Name> 
<LastName>...</LastName> 
</Person> 
<Person> 
<Name>...</Name> 
<LastName>...</LastName> 
</Person> 
</List 
</Persons> 
<field4></field1> 
<field5></field1> 
<field6></field1> 

</root> 

Persons情報を取得する最良の方法は誰にでもありますか?あなただけの情報を読みたい場合は

おかげ

答えて

1

は、あなたが(DOMをロードした後)より良いいただきたい、それにXPathを使用しています。 XPathはJ2SE APIに存在します。特殊な例が必要な場合は書きます。

0

XPathが解決策の一つであり、DTD定義およびIDパラメータを使用してみてください

あなたが別のライブラリを使用したくない場合は...

は、パーサのほとんどはgetElementByIdをしているよりも(ID )funciton

1

私はJAXBを好みます。 J2SE APIにも含まれています。

ヘルプが必要な場合は、お書きください。

+0

感謝を参照してください?あなたの助けてくれてありがとう – ibm123

+0

あなたはJavaに新しいので、私はこの例で正規表現を使用する新しい答えを追加します。どのようにそのことについて? – ZehnVon12

+0

努力してくれてありがとう、私はあなたの答えを確認します – ibm123

1

私はこれをここに残すことは嫌いですが、私は同様の質問hereに答えました。

Javaでは、実際にXMLを解析するためのオプションがかなりあります.XPathは最も遅くなりますが、コンテンツを照会するための素晴らしい表現言語を提供します。 DOMは2番目に遅いですが、歩くためにあなたの文書のメモリ内にツリーモデルを与えます。 SAXは速くなりますが、その場で文書を解析する際にリストを作成する必要があり、最後にSTAXが最も速くなりますが、あなたのリストを構築するためにあなたのフォーマットに特定のコードを書く必要があります。

最後に、私はXPathの容易さでSTAXのパフォーマンスを提供するSJXPと呼ばれるライブラリをお勧めします...それは2つの完全なブレンドです。

"/ root/Persons/list/Person/Name"のようなルールを書いて、それにあなたのドキュメントを渡すと、名前を打つたびにユーザーが指定したコールバックを呼び出すと、見つかりました。

あなたは、あなたが望むすべての値とビオラのルールをいくつか作成します... "/ root/Persons/list/Person"オープンタグのSTART_TAGルールを作成し、新しい "Person p =その後、すべてのサブ要素のヒットとして、あなただけの人に適切な値を設定し、あなたのコード内で新しい人()」、(例として)このような何か:

IRule linkRule = new DefaultRule(Type.CHARACTER, "/root/Persons/list/Person/Name") { 
    @Override 
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) { 
     // Get the last person we added on open-tag. 
     Person p = personList.get(personList.size() - 1); 

     // <Name> tag was parsed, 'text' is our parsed Name. Set it. 
     p.setName(text); 
    } 
} 

SJXPのいいところは、ということですメモリのオーバーヘッドが他のパーサーのアプローチよりも低く、パフォーマンスが向上します(SAXは一致の要素を解析しますが、STAXベースの解析では要素が要求されるまでストリームから要素を解析しません)。

DOMとすべてのNode要素をトラバースしてリストを作成するだけで、まったく同じコードを書くことになります。

XML->オブジェクトマッピングが快適であれば、他の人が言ったことを行い、JAXBを活用することができます。 XMLファイル用のスキーマを作成する必要があります。次に、完全にマップされたJavaオブジェクトを生成します。次にXMLファイルを直接Javaオブジェクトにマップし、 "persons.getList()"のようなものを呼び出したり、JAXBが生成するものを呼び出したりすることができます。

この場合のメモリのオーバーヘッドとパフォーマンスは、DOM解析と同程度です(大まかに)。

Pattern pattern = Pattern.compile("<Person>.*?<Name>(.*?)</Name>.*?<LastName>(.*?)</LastName>.*?</Person>", Pattern.MULTILINE | Pattern.DOTALL); 
Matcher matcher = pattern.matcher(xml); 
while (matcher.find()) 
{ 
    String name = matcher.group(1); 
    String lastName = matcher.group(2); 
} 

ストア独自の者、データ構造内の名前とlastName:

+1

JAXBはXMLスキーマを必要としません。 Javaクラスから始めて、アノテーションを追加してXML表現をカスタマイズすることができます。http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/TheBasics –

+1

Doh、注釈を忘れました。良い修正@BlaiseDoughan。前回JAXBを使用したとき、それとCastorの間にかなり複雑なスキーマがありましたので、私はそこから少し外れています。 –