2016-04-06 6 views
1

このMSDNページでは、Linq-to-XMLを使用して、特定の子ノードを含むXMLノードを見つける方法を示します。残念ながら、私は反対の問題があります:私は大きなリストを持っており、それらのノードのいくつかはがありませんそこにある特定の子ノードがあります。それらを見つける良い方法はありますか?例えば特定の子ノードがないXMLノードを見つける方法

<Objects> 
    <Object> 
    <ID>1</ID> 
    <A>1</A> 
    <B>1</B> 
    <C>1</C> 
    </Object> 
    <Object> 
    <ID>2</ID> 
    <A>2</A> 
    <B>2</B> 
    <C>2</C> 
    </Object> 
    <Object> 
    <ID>3</ID> 
    <A>3</A> 
    <C>3</C> 
    </Object> 
    <Object> 
    <ID>4</ID> 
    <A>4</A> 
    <B/> 
    <C>4</C> 
    </Object> 
</Objects> 

どのように私は#3ではなく、#4を返します行方不明<B>ノードを持つすべての<Object>の要素を、見つけるためにコードを設定しませんか?

答えて

1

XContainer.Element("elementName")戻りnullelementName場合は(注:私は、あなたは自分のXDocument.Descendentsを行う必要があるので、xmlと呼ばれる文字列にあなたのxmlをコピー):存在しないので、これは動作します

static void Main(string[] args) 
    { 
     var elementsWithoutB = XDocument.Parse(xml) 
           .Descendants("Object") 
           .Where(x => x.Element("B") == null); 

     // Prove it works by printing the elements returned 
     foreach (var element in elementsWithoutB) 
     { 
      Console.WriteLine(element.ToString()); 
     } 

     Console.Read(); 
    } 
1

ここにありますあなたはこのような場合のためにXPathを利用したい場合は、別の回避策、あなたはまた、以下のアプローチを使用することができます:

static void Main(string[] args) 
     { 
      XElement objects = XElement.Parse(@"<Objects> 
                <Object> 
                <ID>1</ID> 
                <A>1</A> 
                <B>1</B> 
                <C>1</C> 
                </Object> 
                <Object> 
                <ID>2</ID> 
                <A>2</A> 
                <B>2</B> 
                <C>2</C> 
                </Object> 
                <Object> 
                <ID>3</ID> 
                <A>3</A> 
                <C>3</C> 
                </Object> 
                <Object> 
                <ID>4</ID> 
                <A>4</A> 
                <B/> 
                <C>4</C> 
                </Object> 
               </Objects>"); 

      string xpath_string = "//Object[count(B) = 0]"; //you can change the name of the element anytime, 
                  //even in the run-time also... just make sure 
                  //to add `System.Xml.XPath` to utilize the XPath... 

      IEnumerable<XElement> query_for_objects = objects.XPathSelectElements(xpath_string); 

      foreach (XElement ele in query_for_objects) 
      { 
       Console.WriteLine(ele.ToString()); 
      } 
      Console.ReadKey(); 

nは何ですかこの場合はXPathを使用して氷を作成しているため、コードを変更することなく、実行時でもカスタマイズされたクエリを使用することができます。