2009-02-27 20 views
3

私はLINQを学び、VBを使用してXMLをクエリすることを試みています。VBのLINQを使用した属性に関する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>タグのID属性はそうx.<A>[email protected]はそう、「X内の最初の<A>タグのID属性」を意味

そして、あなたは<Procedure-Text>要素をしたい「MARKER2」

に等しい場合<A>[email protected] = "marker2"Trueと評価されます

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

作品:あなたはSelect x

全例を指定します!ありがとう! FirstOrDefaultではなく、Valueを使用して必要な文字列を取得します。 – mraviator

+1

VBには、C#(私の選択した言語)に欠けているxmlのサポートがたくさんあります。そのVBの唯一のことは、C#で願っていました。また、このサポートがXElementsのダクト入力にも拡張されているかどうかはわかりませんでした。その非常に顕著なコンパイラの魔法。 – Will

1

は、LINQクエリは、ID属性は「MARKER2」でだとすぐに次のノードを取るAという要素を探し、言い換えれば

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

です。

結果の列挙体にFirstOrDefault()を実行して、そこにテキストを含むXNode(実際にはXText)を取得したいと思うでしょう。

関連する問題