2010-12-16 21 views
0

私は村の馬鹿に私を任命します。単純なLinq to XMLクエリは機能しません

なぜこの仕事しません:

foreach (XElement clientField in _clientXml.Descendants("row").Descendants()) 
{ 
    var newFieldName = 
     from sourceField in _sourceEntries.Descendants("Field") 
     where (string)sourceField.Attribute("n") == (string)clientField.Attribute("n") 
     select new 
      { 
       FieldName = ((string) sourceField.Attribute("n")), 
       AcordRef = ((string) sourceField.Attribute("m")) 
      }; 
     foreach (var element in newFieldName) 
     { 
      Console.WriteLine("Field Name: {0}", 
      element.FieldName, element.AcordRef); 
     } 
} 

私のソースXMLファイルはXElement.Load(myFileName)がロードされています。デバッグでは、clientFieldには属性n = "ポリシー番号"があります。 _sourceEntries.Descendants( "Field")の最初の要素には、属性n = "ポリシー番号"もあります。実際、_clientXml.Descendants( "row")の各要素。Descendants()に_sourceEntries.Descendants( "Field")に一致する行があります。そして、私は選択が怠惰であることを知ることができるだけのことを知っているので、デバッグではConsole.WriteLineブロックを見ます。何を試しても、newFieldNameは空のセットです。

は、念のため、ここではクライアントファイルの最初の要素です:

<Column_0 n="Policy Number">ABC000123</Column_0> 

そして、ここで_sourceEntriesコレクションの拳要素です:私は、単純なものになるだろう知っている

<Field n="Policy Number" c="1" l="" s="" cd="" m="1805" f="" /> 

しかし、私は何が間違っているのか分かりません。

ありがとうございました。

ランディ

+0

Console.WriteLine "Field Name:{0}"は引数が1つだけですが、 }、値{1} "? –

+0

_clientXmlの@EoRaptor13は、descendatノードの書かれた行またはRowですか? –

+0

ジュリアン、行、小文字。 Alexi、申し訳ありませんが、第2引数をWritelineに追加するのを忘れてしまいました。私は2つ持っていたが、それがうまくいかなかったときには、ただ1つ書くだけで簡単にしようとした。まだ喜びはありません。 ありがとうございました。 – EoRaptor013

答えて

1

これは私が最終的に行うために必要な達成します醜い共同のために月のde。私が気づいたことの1つは、XElementツリーの要素がIEnumerableコレクションのXElementsと一致しないように見えることです。上記の元のコードでは、_sourceEntriesオブジェクトが見つかりました。これは_clientTemplate.Descendants( "SourcEntries")から派生したコレクションです。子孫( "Field")。私は2つのフォームが本質的に私の目的のために同等であると思ったでしょうが、明らかにそうではありません。誰かがこの問題についてコメントしていただければ幸いです。

ありがとうございました!

+0

私はそれについてもっと考えると、XMLツリー(それは子供XElementsを持つXElementとIEnumerable コレクション)の間のインピーダンスの不一致についてもっと疑問に思っています。ドキュメントの理解できるところから、IEnumerableコレクションはXMLツリーと同じ拡張機能検索機能を持つ必要があります。しかし、XMLファイルに "到達"するためにコレクションを代用すると、クエリは機能しません。 私は気にしません、多分それは私です。 – EoRaptor013

0

は変更してみてください:

where (string)sourceField.Attribute("n") == (string)clientField.Attribute("n") 

へ:それは確かに候補者の

foreach (var clientField in _clientXml.Descendants("row").Descendants()) 
    { 
     foreach (var acordMapRef in 
      from sourceEntry in _clientTemplate.Descendants("SourceEntries").Descendants("Field") 
       where (string) clientField.Attribute("n") == (string) sourceEntry.Attribute("n") 
       from acordMapRef in _clientTemplate.Descendants("Acord").Descendants("Field") 
       where (string) sourceEntry.Attribute("m") == (string) acordMapRef.Attribute("id") 
       select acordMapRef) 
      { 
       clientField.Attribute("n").Value = (string) acordMapRef.Attribute("n"); 
      } 
    } 

しかし、:

where sourceField.Attribute("n").Value == clientField.Attribute("n").Value 
+0

喜びはありません。しかし、実際に私の元のコードは、本、ブログ、ドキュメントのさまざまな例とほとんど同じように見えます。何かファンキーなことが起こっているだけです。もし私がそれを理解することができれば。 ご覧いただきありがとうございます。 – EoRaptor013

+1

XMLを見ても言い難いですが、XAttributeクラスの文字列表現を比較しているので、コード内の属性値を比較していないため、上記のことができます。 – devdigital

関連する問題