我有一个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文件插入到插入查询中
答案 0 :(得分: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 ...
}
希望这个新添加的代码能给你一些更好的主意:)