2009-08-26 35 views
0

:このXMLで正規表現XML文字列

<ser:serviceItemValues> 
    <ord1:label>Start Type</ord1:label> 
    <ord1:value>Loop</ord1:value> 
    <ord1:valueCd/> 
    <ord1:activityCd>iactn</ord1:activityCd> 
</ser:serviceItemValues> 

第一に異なる値(と上記の要素の繰り返しがたくさんあるだろうループなど)およびその他のxml要素について説明します。主に私が心配しているのは、値として 'Loop'を持たないserviceItemValuesがある場合です。私はこれを試してみましたが、それは動作していないよう:HTMLやXMLを大量に解析するとき

+0

すべてのコメントありがとう、私は正規表現を使用しないと言って少し明確にさせてください。私は値が何であるか気にしません。私はそれを取得しようとしていません、私は例外がスローされない場合、それがループを確実にしたいと思っています。だから私はそれが検証だと思うが、私はxsdを変更することはできません。 – arinte

+1

私は誰もがあなたがしようとしていることを理解していると信じています。しかし、正規表現は最良の解決策ではありません。マークアップはパーサに委ねるのが最も良い方法です。 – doomspork

答えて

3

XPathを参照してください。これはXML用の正規表現のようです。並べ替え

XPathを使用すると、XML文書から情報を抽出する式を記述するので、ループをサブノードとして持たないノードを抽出することは、まさにそれが切り取ったものです。

私はこれを試していないが、最初の刺すように、私はXPath式のようなものになります推測すると思います。他の回答で述べたように

"//ser:serviceItemValues/ord1:value[text()!='Loop']/parent::*" 
+0

これを止めるのを止めると、これは問題に近づくための間違った方法だと分かっています:( – Esko

+1

なぜこれは間違っているのですか?これはxpathとまったく同じですか? – izb

4

正規表現は、最良の選択肢ではありません

private static Pattern LOOP_REGEX = 
     Pattern.compile("[\\p{Print}]*?<ord1:label>Start Type</ord1:label>[\\p{Print}]+[^(Loop)][\\p{Print}]+</ser:serviceItemValues>[\\p{Print}]*?", Pattern.CASE_INSENSITIVE|Pattern.MULTILINE); 

感謝。

正規表現に頼ることなくこれを処理できる方法はいくつかあります。あなたが自由に使えるライブラリによっては、XPathを使って探している要素を見つけることができるかもしれません。あなたの方法であなたを助けるかもしれない

HERESに役立つチュートリアル:http://www.totheriver.com/learn/xml/xmltutorial.html

3

正規表現は、この仕事のための適切なツールではありません。 XMLパーサーを使用している必要があります。セットアップと使用はかなりシンプルで、おそらくコード化にかかる時間が短くなります。それから、この正規表現が出てくるでしょう。

JDOMをお勧めします。それは簡単な構文を持っています。例では、ここで見つけることができます:あなたがパースされたドキュメントが大きい場合は、SAXパーサーを使用する必要があります http://notetodogself.blogspot.com/2008/04/teamsite-dcr-java-parser.html

、私はXercesをお勧めします。

1

XMLを扱う場合、おそらく正規表現を使用してコンテンツをチェックしないでください。その代わりに、SAX解析ベースのルーチンを使用して、関連する内容やDOMのようなモデルを確認してください(大きな文書を扱う場合はプルベースが望ましい)。

もちろん、ドキュメントの内容をどうにかして検証しようとするなら、おそらくスキーマツールを使うべきです(私はRELAX NGやSchematronと一緒に行くでしょうが、XML Schemaを使うことができると思います)。

1

を、正規表現をするためのツールではありません仕事。 XPathエンジンが必要です。しかし、コマンドラインからこれらのものを使いたい場合は、XMLStarをインストールすることをお勧めします。私はこのツールで非常に良い経験を持ち、さまざまなXML関連のタスクを解決しています。お使いのOSによっては、xmlstarlet RPMまたはdebパッケージをインストールするだけで済みます。 Mac OS Xのポートにはパッケージも含まれていると思います。

+0

Ups、あなたはJavaでやりたかったのです。 、xmlstarはまだ素晴らしいツールです。 – Hardy