0

次の XML があります。

<!--Gaffer Tape Regions--> 
  <masks>
   <mask name="Serato">
    <rectangle>
      <xPosition>100</xPosition>
      <yPosition>100</yPosition>
      <height>100</height>
      <width>100</width>
     </rectangle>
     <rectangle>
        <xPosition>500</xPosition>
        <yPosition>500</yPosition>
        <height>100</height>
        <width>100</width>
    </rectangle> 
  </mask>   
  <mask name="Traktor">
    <rectangle>
      <xPosition>180</xPosition>
      <yPosition>70</yPosition>
      <height>200</height>
      <width>300</width>
     </rectangle>
     <rectangle>
        <xPosition>500</xPosition>
        <yPosition>500</yPosition>
        <height>50</height>
        <width>160</width>
    </rectangle>   
  </mask>
 </masks>

そして、「Serato」という名前のマスク要素の下にあるすべての四角形要素を取得したいと思います。

Linq to XML でこれを行う最善の方法は何ですか?

編集:動作しないコードを追加

現在これを試しています:

XDocument maskData = XDocument.Load(folderPath + @"\masks.xml");


            var masks =
                    from ma in maskData.Elements("mask")
                    where ma.Attribute("name").Value == "Serato"
                    from rectangle in ma.Elements("rectangle")
                    select rectangle;

しかし、マスク クエリは null を返します。

4

2 に答える 2

2
var xml = XElement.Parse(s);
var rectangles = 
    from mask in xml.Elements("mask")
    where mask.Attribute("name").Value == "Serato"
    from rectangle in mask.Elements("rectangle")
    select rectangle;
于 2013-05-15T22:42:11.797 に答える
1

LINQ to XML でクエリを実行する場合、Rootノードを含める必要があります。ルート ノードを含めると、編集したクエリが機能します。

var masks =
    from ma in maskData.Root.Elements( "mask" ) // <-- notice .Root.
    where ma.Attribute( "name" ).Value == "Serato"
    from rectangle in ma.Elements( "rectangle" )
    select rectangle;

またはメソッドチェーンを使用して:

var rect = maskData.Root.Elements( "mask" )
        .Where( x => x.Attribute( "name" ).Value == "Serato" )
        .Elements( "rectangle" );
于 2013-05-16T00:17:19.283 に答える