2016-04-06 14 views
1

Bu MSDN sayfası, belirli bir alt düğüm içeren XML düğümlerini bulmak için Linq'den XML'e nasıl kullanıldığını gösterir. Ne yazık ki, ben tam tersi sorun var: Ben büyük bir liste var ve bu düğümlerin bir kaç eksik olması gereken belirli bir çocuk düğümü olan vardır. Onları bulmanın iyi bir yolu var mı? ÖrneğinBelirli bir alt düğümde eksik olan XML düğümü nasıl bulunur?

:

<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> 

nasıl 3. değil 4. dönecekti eksik <B> düğümle tüm <Object> unsurları bulmak için kod kurmak ki?

cevap

1

XContainer.Element("elementName") döner nullelementName if (not: Ben xml adında bir dize içine xml kopyalanan, sadece XDocument üzerinde .Descendents yapmanız gereken bu yüzden): yok çünkü bu işler

İşte
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

olduğunu Bu durum için XPath kullanmak isterseniz başka iş çevresinde, ayrıca aşağıda yaklaşımı kullanabilir:

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 nedir Bu durumda XPath kullanarak buz, kodunuzu değiştirmeden, çalışma zamanında da özelleştirilmiş bir sorgu kullanabilirsiniz!

İlgili konular