【问题标题】:Select the value of a attribute based on another attribute value from XML根据 XML 中的另一个属性值选择一个属性的值
【发布时间】:2012-10-10 17:50:47
【问题描述】:

我有一个 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 文件插入到插入查询中

【问题讨论】:

    标签: c# xpath xml-parsing


    【解决方案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 ...
    }
    

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

    【讨论】:

    • 我有 xmlnode compleat xml 非常大,就像 leads\lead[]\fields\fields[] 。在解析 xml 之后,我在循环中并且现在从每个潜在客户中将 xml 节点列表作为潜在客户(潜在客户列表),我需要所有字段。您的解决方案很好,但您可以修改它以使用 nodelist 我喜欢方法 elem.Where(c =&gt; c.Attribute("FieldId").Value.Equals("1")).Select(s =&gt; s.Attribute("Value").Value).FirstOrDefault(); 但它不适用于 xmlNode 对象
    • 你能用很少的 Xml 的潜在客户\lead[]\fields\fields[] 修改你的问题,并尝试稍微解释一下,以帮助我详细了解你的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多