XML到LINQ元素的选择

时间:2012-02-06 23:23:56

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

我有一个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") };

在这两种情况下,我似乎都很短暂。它正在生成预期的行数,但未填充值。

有人能指出我正确的方向吗?我错过了什么?

4 个答案:

答案 0 :(得分:1)

您没有名为“PhysicalLocation”或“ID”的属性。你只有名为'姓名'的属性。

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

答案 1 :(得分: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"],
    };

答案 2 :(得分:0)

试试这个:

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

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

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

答案 3 :(得分:0)

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

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 }