2009-02-27 90 views
3

我在學習LINQ,並且在使用VB查詢XML時遇到了一個問題。使用LINQ對屬性進行VB XML查詢

我的XML:

<Procedure-Text> 
    <A ID="marker1"></A>Do This Procedure 
</Procedure-Text> 
<Procedure-Text> 
    <A ID="marker2"></A>Do That Procedure 
</Procedure-Text> 

我如何指定我的查詢來獲取只具有ID屬性MARKER2的過程文本?換句話說,我想要一個結果字符串,說做這個程序

感謝

回答

6

使用VB XML文本:

Dim marker2 = From x In data...<Procedure-Text> _ 
       Where x.<A>[email protected] = "marker2" _ 
       Select x 

三重點語法生成XML元素的「所有後代」,即data...<Procedure-Test>會產生內部data

XML的點語法的<Procedure-Test>標籤列表文字意味着「第一後裔」,所以x.<A>將在x內產生<A>的第一次出現。其中X是現在的<Procedure-Test>

實例,現在你有所需<A>元素,它的ID比較字符串是平凡與@attr屬性選擇。 <A>[email protected] = "marker2"將計算爲True如果<A>標籤的ID屬性等於「標記2」

所以x.<A>[email protected]意味着

和「內部X第一<A>標籤的ID屬性」你想要的<Procedure-Text>元素,所以您指定Select x

完整的示例:

Sub Main() 

    Dim data = <doc> 
        <Procedure-Text> 
         <A ID="marker1"></A>Do This Procedure 
        </Procedure-Text> 
        <Procedure-Text> 
         <A ID="marker2"></A>Do That Procedure 
        </Procedure-Text> 
       </doc> 

    Dim marker2 = From x In data...<Procedure-Text> _ 
        Where x.<A>[email protected] = "marker2" _ 
        Select x 

    ' prints the second procedure-text element 
    Console.WriteLine(marker2.FirstOrDefault().ToString()) 

    Console.ReadKey() 

End Sub 
+0

作品!謝謝! 而不是FirstOrDefault,我使用Value來獲取我需要的字符串。 – mraviator 2009-02-27 18:35:38

1

LINQ查詢是

from x 
in d.Descendants("A") 
where x.Attribute("ID").Value == "marker2" 
select x.NextNode 

換句話說,尋找命名爲A的元素,其中它的ID屬性是「標記2」,並採取立即下一個節點。

您可能想對結果枚舉執行FirstOrDefault()以獲取其中包含文本的XNode(實際上是一個XText)。