2012-03-01 19 views
0

私は解析中のXML文書を持っていますが、これはどのような種類の固定スキーマにも従っていません。フォールトトレラントXML解析

invoiceDetail.PartNO = invoiceLine.Element(ns + "Item").Element(ns + "ItemID").Element(ns + "ID").Value; 

この例では、invoiceLineはXElement型です。この例では、次のようにして値を解析する必要があります。問題は、いくつかのノードが常に存在するとは限らず、そのような場合には、エラーを返す代わりにnullまたは空を返すことが望ましいということです。現在のところこれを行う方法はありますか?または、解析するために名前空間と要素名のリストを取る特別な関数を自分で作る必要はありますか?

+0

標準に準拠していない場合は、標準であるXMLにすることはできません。 – Oded

+0

@Oded - あなたはそれを何と呼びますか?これは、開始タグごとに終了タグを持つ標準に従います。問題は、複数のレベルでタグ名を再利用し、同じレベルで異なる名前のタグを繰り返すことです。また、同じタイプの異なる文書に表示されるタグと表示されないタグがあります。 –

+0

それはどんな標準にも従わないが、それがXMLであると言うのは誤解を招く。整形式XMLの場合は、整形式XMLであり、その標準に従います。それが固定スキーマを持たず、スキーマに対して検証できないということを意味するなら、それは別のものです。 – Oded

答えて

2

XLINQは既にこれを行います。
.Element()は、その名前の要素がない場合はnullを返します。

は、繰り返しのヌルチェックを避ける代わりに .Elements()を使用するには:

invoiceDetail.PartNO = (string) 
    invoiceLine.Elements(ns + "Item") 
       .Elements(ns + "ItemID") 
       .Elements(ns + "ID") 
       .SingleOrDefault(); 

Elements()呼び出しはIEnumerable<XElement>を返します。一致する要素がない場合、空のシーケンスが返され、残りのコードは引き続き動作します。

.SingleOrDefault()最後のシーケンスを単一の要素またはnullに変換します。
キャストは、要素がnullの場合はnullを返すカスタム明示的変換を呼び出します。同様に、基本的な値の型に直接キャストできます。

+0

しかし、3要素を深くする必要がある場合は、次の要素に行く前に.Element()の各結果をチェックしてから最後に、最後の.Element()がnullであるかどうかをチェックする必要があります私はエラーで終わります。 –

+1

@RandomBen:代わりに '.Elements()'(複数形)を呼び出します。この方法では、 'null'の代わりに空のコレクションを取得します。 – SLaks

+1

invoiceLine.Descendants( "ID")を使用するオプションですか?それは構造を無視してすべての "ID"要素を返すでしょう。 –