2012-02-06 95 views
1

我有以下格式的xml文档。XML到LINQ元素选择

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

而在这两种情况下我似乎短上来。它正在生成预期数量的行,但这些值未被填充。

任何人都可以指向正确的方向吗?我错过了什么?

回答

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"], 
    }; 
+0

谢谢您的输入可惜与上面的代码我收到以下错误:{“给定的关键是不存在的字典。 “} – 2012-02-06 23:49:01

+1

@MaximGershkovich - 我用你的问题中提供的XML示例,它对我来说工作得很好。让我知道你是否有不好的XML,或者你是否有稍微复杂的要求。 – Enigmativity 2012-02-07 00:18:44

+0

我的不好,我有一些不好的数据(我有一个40MB的XML数据集)。你是对的,你的代码很好用。谢谢... – 2012-02-07 00:57:54

1

您没有名为'PhysicalLocation'或'ID'的属性。你只有属性称为'名称'。

您需要在“名称”的值增加一个where子句属性来查找您的ID和PhysicalLocation

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