2014-01-20 80 views
1

此問題的變體已被問到,但我還沒有找到能幫助我解決問題的人。XML到Linq獲取具有屬性值的子節點

鑑於這種格式的XML文件:

<TopLevel> 
    <SecondLevel Name="Name" Color="Blue"> 
     <ChildNode1></ChildNode1> 
     <ChildNode2></ChildNode2> 
    </SecondLevel> 
    <SecondLevel Name="Name2" Color="Red"> 
     ... 
    </SecondLevel> 
</topLevel> 

我有值的屬性顏色。 我想要的是能夠首先找到與該顏色對應的Name,然後查找所有的子節點。

我更喜歡在XDocument上使用Xelement。

這是我迄今嘗試過的,但沒有運氣。

XElement xelement = XElement.Load("XmlFile.xml"); 
IEnumerable<XElement> Name2= 
      from el in xelement.Elements("SecondLevel") 
      where el.Attribute("Color") == "Red" 
      select el; 

因此,我最終想要將其格式化爲數據表。這是可行的嗎?

回答

2

你只是缺少屬性轉換爲字符串(或直接獲取它的值 - 見最後的註釋)。與el.Attribute("Color").Value直接您還可以訪問屬性值,但會拋出異常,如果元素沒有Color屬性:您也可以選擇Name屬性值有一個字符串的序列,而不是XElements的:

XElement xelement = XElement.Load("XmlFile.xml"); 
IEnumerable<string> names = 
      from el in xelement.Elements("SecondLevel") 
      where (string)el.Attribute("Color") == "Red" // here 
      select (string)el.Attribute("Name"); 

注意。因此,鑄造更安全,但如果您希望代碼在xml無效時快速失敗,則可以選擇訪問值。

順便說一句,你還可以使用XPath來取得具有所需顏色的第二級元素:

IEnumerable<XElement> secondLevels = 
     xelement.XPathSelectElements("SecondLevel[@Color='Red']"); 
+0

這是偉大的,因爲它發現與顏色相關聯的名稱屬性,但如果我想的子節點的' SecondLevel'node? –

+1

@moalaz然後將代碼保留原樣 - 'select el'沒有投影到Name屬性值。因此,您將擁有XElements序列 –

+0

完美!有誰知道一個簡單的方法把孩子節點放入數據表? –