2012-02-06 97 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 }