2012-10-10 89 views
0

另一个属性值我有一个的XmlNodeList作为选择属性的基础上的XML

<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"; 

编辑:我不想循环扔领域,并检查每个领域,如果条件。

单线解决方案是最受欢迎的。

注:我处理的非常大的XML和Fields是单个节点的一部分,大约有500节点的千田,任何其他更好的解决这个更大的XML文件转换为插入查询是最欢迎

回答

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 ... 
} 

希望这新添加的代码能给你一些更好的主意:)

+0

我已经XmlNode的compleat XML是非常大的,就像是'线索\导致[] \场\ fields []'。解析XML后,我在循环中,并具有XML列表作为领导(列表的领导)现在从每一个领导我需要所有的领域。你的解决方案是好的,但你可以修改它与nodelist一起工作,我喜欢这个方法'elem.Where(c => c.Attribute(“FieldId”)。Value.Equals(“1”))。Select(s => s .Attribute(“Value”)。Value).FirstOrDefault();'但它不适用于一个'xmlNode'对象 – Champ

+0

你可以修改你的问题,只需少量xml的线索\ lead [] \ fields \ fields []并尝试解释它有点帮助我详细了解你的要求。 –