【问题标题】:XML to LINQ element selectionXML to LINQ 元素选择
【发布时间】:2012-02-06 23:23:55
【问题描述】:

我有一个以下格式的 xml 文档。

<?xml version="1.0" encoding="UTF-8" ?>

<Rows>
<Row>    
    <Field Name='PhysicalLocation'>11;#West</Field>
    <Field Name='ID'>3327</Field>
</Row>
</Rows>

并且正在尝试使用它进行 linq 选择。

我已经尝试了以下方法。

XDocument xmlDoc = XDocument.Load("C:\\manifest.xml");

var query = from item in xmlDoc.Descendants("Rows").Elements()
                    select new { ID = item.Attribute("ID").Value, Value = item.Attribute("PhysicalLocation").Value };

还有

XDocument xmlDoc = XDocument.Load("C:\\manifest.xml");

var query = from item in xmlDoc.Descendants("Rows").Elements()
                    select new { ID = item.Element("ID"), Value = item.Element("PhysicalLocation") };

在这两种情况下,我似乎都做不到。它正在生成预期数量的行,但未填充值。

谁能指出我正确的方向?我错过了什么?

【问题讨论】:

    标签: .net xml linq linq-to-xml


    【解决方案1】:

    试试这样的查询怎么样:

    var query =
        from item in xmlDoc.Descendants("Rows").Elements()
        let values = item.Elements("Field")
            .ToDictionary(x => x.Attribute("Name").Value, x => x.Value)
        select new
        {
            ID = values["ID"],
            Value = values["PhysicalLocation"],
        };
    

    【讨论】:

    • 感谢您的输入,但不幸的是,使用上面的代码我收到以下错误:{“字典中不存在给定的键。”}
    • @MaximGershkovich - 我使用了您在问题中提供的示例 XML,它对我来说效果很好。如果您有错误的 XML 或者您有稍微复杂的要求,请告诉我。
    • 糟糕,我有一些糟糕的数据(我有一个 40mb 的 XML 数据集)。你是对的,你的代码很好用。谢谢...
    【解决方案2】:

    您没有名为“PhysicalLocation”或“ID”的属性。您只有名为“名称”的属性。

    您需要在 'name' 属性的值上添加 where 子句以查找您的 ID 和 PhysicalLocation

    【讨论】:

      【解决方案3】:

      我认为这应该可以解决问题:

      var xDoc = XDocument.Parse(
      @"<?xml version='1.0' encoding='UTF-8' ?> 
      
      <Rows> 
          <Row>     
              <Field Name='PhysicalLocation'>11;#West</Field> 
              <Field Name='ID'>3327</Field> 
          </Row> 
      </Rows>");
      
      var res = from row in xDoc.Root.Elements("Row")
                select new
                {
                    ID = (int)row.Elements("Field").Single(e => (string)e.Attribute("Name") == "ID"),
                    PhysicalLocaltion = (string)row.Elements("Field").Single(e => (string)e.Attribute("Name") == "PhysicalLocation"),
                };
      
      foreach (var r in res)
      {
          Console.WriteLine(r);
      }
      

      这是循环打印的结果:

      { ID = 3327, PhysicalLocaltion = 11;#West }
      

      【讨论】:

        【解决方案4】:

        试试这个:

                var xd = XDocument.Load("C:\\manifest.xml");
                var query = xd.Root.Descendants("Row").Elements("Field")
                    .Select(s => new
                    {
                        Name = (string)s.Attribute("Name"),
                        Value = s.Value
                    });
        

        上面的代码循环遍历每个“Row”元素,然后读取“Field”元素数据。它将返回以下匿名列表:

        Name = PhysicalLocation
        Value = 11;#West
        Name = ID
        Value = 3327 
        

        要循环查询,可以使用以下代码:

                var sb = new StringBuilder();
                foreach (var i in query)
                {
                    sb.Append("\n Name = ").Append(i.Name).Append("\n Value = ").Append(i.Value);
                }
        

        最后,要通过Name 找到Field element value,您可以使用以下查询:

        var query2 = query.Where(w => w.Name == "ID").Single().Value;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多