2015-05-28 35 views
0
獲得元素

我有XDocument類型的customUIXml對象,它具有以下XML的值:不能按屬性值和的XDocument

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load"> 
    <ribbon> 
    <tabs> 
     <tab id="t1" label="Shalala"> 
     <!-- stuff --> 
     </tab> 
     <tab id="tab_dev" label="SomeOtherTab"> 
     <!-- stuff --> 
     </tab> 
     <tab id="t108" label="MyTab"> 
     <!-- stuff --> 
     </tab> 
    </tabs> 
    </ribbon> 
</customUI> 

,我想要得到的tab節點與標籤值「MYTAB」 。這是我使用的代碼:

Dim xtab As XElement = Nothing 
Dim nodes = From nodeToTake In customUIXml.Descendants().Elements("tab") _ 
      Where nodeToTake.Attribute("label").Value = "MyTab" 
      Select nodeToTake 

For Each tab As XElement In nodes 
    xtab = tab 
Next 

但我得到任何結果,我似乎無法找到我在做什麼錯?

回答

0

你可以簡單地使用XML文本,讓您的代碼會一樣容易:

Dim xtab = customUIXml.<ribbon>.<tabs>.<tab>.First(Function(tab) [email protected] = "MyTab") 

此外,您的代碼似乎工作,所以你的問題似乎在別處。

Dim customUIXml = <customUI> 
<ribbon> 
    <tabs> 
    <tab id="t1" label="Shalala"> 
     <!-- stuff --> 
    </tab> 
    <tab id="tab_dev" label="SomeOtherTab"> 
     <!-- stuff --> 
    </tab> 
    <tab id="t108" label="MyTab"> 
     <!-- stuff --> 
    </tab> 
    </tabs> 
</ribbon> 
</customUI> 

Dim xtab As XElement = Nothing 
Dim nodes = From nodeToTake In customUIXml.Descendants().Elements("tab") _ 
      Where nodeToTake.Attribute("label").Value = "MyTab" 
      Select nodeToTake 

For Each tab As XElement In nodes 
    xtab = tab 
Next 

Console.WriteLine(xtab) 

顯示

<tab id="t108" label="MyTab"> 
    <!-- stuff --> 
</tab> 

就好了。


如果實際的XML包含命名空間,你必須考慮到這一點:

... 
Dim df As XNamespace = customUIXml.Name.Namespace 

Dim xtab As XElement = Nothing 
Dim nodes = From nodeToTake In customUIXml.Descendants().Elements(df + "tab") _ 
      ... 
+0

用文字給了我異常'序列中沒有匹配element' ......我檢查XML和節點是有....另外,你認爲問題與使用linq-to-xml可能與命名空間連接? – Syspect

+0

@Syspect如果你的XML有一個名字空間,你必須考慮到這一點。正如我的答案所示,您在問題中所發佈的xml在您的代碼中工作得很好。因此,如果您的實際XML不同(例如使用命名空間),則應更新您的問題以包含該問題。 – sloth

+0

@Syspect查看我的關於如何將名稱空間添加到查詢中的更新 – sloth

0
string xml = "<customUI xmlns='http://schemas.microsoft.com/office/2009/07/customui' onLoad='Ribbon_Load'><ribbon><tabs><tab id='t1' label='Shalala'><!-- stuff --></tab><tab id='tab_dev' label='SomeOtherTab'><!-- stuff --></tab><tab id='t108' label='MyTab'><!-- stuff --></tab></tabs></ribbon></customUI>"; 

var xelement = XElement.Parse(xml); 
var list = xelement.Descendants().Where(x => x.Name.LocalName == "tab" && x.Attribute("label") != null).ToList(); 
list.ForEach(x => Console.WriteLine(x.Attribute("label").Value)); 

你可以訪問的localName檢查elment標籤值, 經過與LinqPad它作品預計希望有所幫助..

:)

編輯:Vb從Telerik的代碼轉換:

Dim xml As String = "<customUI xmlns='http://schemas.microsoft.com/office/2009/07/customui' onLoad='Ribbon_Load'><ribbon><tabs><tab id='t1' label='Shalala'><!-- stuff --></tab><tab id='tab_dev' label='SomeOtherTab'><!-- stuff --></tab><tab id='t108' label='MyTab'><!-- stuff --></tab></tabs></ribbon></customUI>" 

Dim xelement__1 = XElement.Parse(xml) 
Dim list = xelement__1.Descendants().Where(Function(x) x.Name.LocalName = "tab" AndAlso x.Attribute("label") IsNot Nothing).ToList() 
list.ForEach(Function(x) Console.WriteLine(x.Attribute("label").Value))