2013-01-06 74 views
1

我有一個XML文件,我想用LINQ查詢。我想爲每個記錄創建一個新行。這是我迄今爲止嘗試過的並且失敗了。使用LINQ查詢XML文件

<?xml version="1.0" encoding="utf-8"?> 
<categories xmlns="urn:schemas-pi-meta:categories" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:schemas-pi-meta:categories Xsd/meta.xml.config.xsd"> 
<category name="history"> 
    <data> 
     <value name="customer">2</value> 
     <value name="truck">1</value> 
    </data> 
    <category name="record"> 
     <data> 
     <value name="time">1/3/2013 2:22:41 PM</value> 
     <value name="quantity">3</value> 
     <value name="unit">barrels</value> 
     <value name="cancelled">false</value> 
     <value name="errored">false</value> 
     </data> 
    </category> 
    </category> 

該文件更長,所以我已經將它剪掉了,但它會重演。

這就是我試圖做:

XElement root = XElement.Load("D:\\Linq XM\\history.xml.config"); 

IEnumerable<XElement> address = from el in root.Elements("categories") 
    where (string)el.Attribute("category") == "record" 
    select el; 

我曾試圖改變要素價值的思考,我可能失去了一些東西,但不知何故查詢沒有返回我的數據。

+1

的''節點不顯示一個**類別**屬性,那麼爲什麼你會試圖在你的** where子句中詢問這些? –

+0

目前還不清楚你想從xml中選擇什麼。值?類別名稱? –

回答

8

據我所知,有四個問題。

第一個問題是,你正在尋找categories元素下的根元素 - 當categories元素根元素。我懷疑你真的想要尋找category元素而不是categories元素。

第二個問題是,您正試圖找到名爲category屬性。在我看來,您應該檢查元素內部名爲name的屬性category

第三個問題是,隨着record一個name屬性類是不實際的categories在所有直接子元素 - 這是一個後裔,但不是直接子 - 所以你應該使用Descendants代替Elements

第四個問題是你沒有指定一個名稱空間。這是文件的一部分:

<categories xmlns="urn:schemas-pi-meta:categories" ... 

指定該元素和後代的默認命名空間是URI "urn:schemas-pi-meta:categories"。所以你需要指定,當你說你想要的。

把這些都在一起,你會得到:

XNamespace ns = "urn:schemas-pi-meta:categories"; 
var query = from el in root.Descendants(ns + "category") 
      where (string) el.Attribute("name") == "record" 
      select el; 

或沒有查詢表達式(因爲它是更多的麻煩比它的價值在這裏):

XNamespace ns = "urn:schemas-pi-meta:categories"; 
var query = root.Descendants(ns + "category") 
       .Where(el => (string) el.Attribute("name") == "record");