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();

由于无法在一行代码中分离 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 回答