0

私はxmlNodeListを持っています

<Fields>
  <Field FieldId="1" Value="123" FieldTitle="id" FieldType="Text"/>
  <Field FieldId="2" Value="abc" FieldTitle="First Name" FieldType="Text"/>
  <Field FieldId="3" Value="efg" FieldTitle="Last Name" FieldType="Text"/>
</Fields>

今私が欲しいのは

var id        = 123   //select the `value` if `FieldId == "1";
var firstName = abc   //select the `value` if `FieldId == "2";
var last name = efg  //select the `value` if `FieldId == "3";

編集:フィールドをスローしてループし、if条件ですべてのフィールドをチェックしたくありません。

ワンライナーソリューションは大歓迎です。

注:私は非常に大きな XML を扱っており、これFieldsは単一ノードの一部であり、数千のノードの約 500 フィールドがあります。このはるかに大きな XML ファイルを挿入クエリに変換するための他のより良いソリューションは大歓迎です

4

1 に答える 1

1

このコードを使用してそれを実行する方法について、かなり良いアイデアを得ることができます。

XDocument doc = XDocument.Load(@"XmlFile1.xml");
var elem = doc.Descendants("Field");

var id = elem.Where(c => c.Attribute("FieldId").Value.Equals("1")).Select(s => s.Attribute("Value").Value).FirstOrDefault();
var firstName = elem.Where(c => c.Attribute("FieldId").Value.Equals("2")).Select(s => s.Attribute("Value").Value).FirstOrDefault();
var lastName = elem.Where(c => c.Attribute("FieldId").Value.Equals("3")).Select(s => s.Attribute("Value").Value).FirstOrDefault();

1 行のコードで id、firstName、および lastName の間のデータを分離する方法がないため、ワンライナー ソリューションは実際には不可能です。

追加した:

var result = doc.Descendants("Field").Select(s => new { Field = s.Parent.GetHashCode(), FieldId = s.Attribute("FieldId").Value, Value = s.Attribute("Value").Value });
foreach (var val in result.GroupBy(g => g.Field).Select(s => s))
{
    var id = result.Where(c => c.Field == val.Key && c.FieldId == "1").Select(s => s.Value).FirstOrDefault();
    var firstName = result.Where(c => c.Field == val.Key && c.FieldId == "2").Select(s => s.Value).FirstOrDefault();
    var lastName = result.Where(c => c.Field == val.Key && c.FieldId == "3").Select(s => s.Value).FirstOrDefault();
    // ... do something ...
}

この新しく追加されたコードにより、より良いアイデアが得られることを願っています:)

于 2012-10-10T18:06:32.143 に答える