2012-01-22 56 views
0

我怎樣才能節點「字段名」的基礎上XID & &通過LINQ沒到XML節點。 注意:dID可能存在也可能不存在。 我到目前爲止試過的東西印在下面。 但是我的代碼不處理時沒有按做的條件不存在的LINQ to XML獲得基於多個條件

<Configuration> 
     <Contract xID="2"> 
      <Document dID="227"> 
       <FieldName name="AAAA"/> 
       <FieldName name="BBBB"/> 
      </Document> 
     </Contract> 
     <Contract xID="5"> 

       <FieldName nam`enter code here`e="CCCC"/> 
       <FieldName name="DDDD"/> 

     </Contract> 
    </Configuration> 

是我迄今爲止嘗試過下面被打印出來。 但是我的代碼不處理的情況時,確實沒有按不存在

XDocument xmlDoc = XDocument.Load("../../FieldConfiguration.xml"); 

    var fieldNames = (from n in xmlDoc.Descendants("Contract") 
         where (int)n.Attribute("xID") == 5 && 
          (int)n.Element("Document").Attribute("dID") == 227 
         from f in n.Element("Document").Elements() 
         select (string) f.Attribute("name")).ToList(); 

    foreach (string name in fieldNames) 
    { 
     Console.WriteLine("Site: " + name); 
    } 

回答

0

只是你的where子句

XDocument xmlDoc = XDocument.Load("../../FieldConfiguration.xml"); 

    var fieldNames = (from n in xmlDoc.Descendants("Contract") 
         where (int)n.Attribute("xID") == 5 && 
          n.Element("Document").Attribute("dID") != null && 
(int)n.Element("Document").Attribute("dID") == 227 
          from f in n.Element("Document").Elements() 
          select (string) f.Attribute("name")).ToList(); 

    foreach (string name in fieldNames) 
    { 
     Console.WriteLine("Site: " + name); 
    } 
+0

傑森添加檢查空:如果我的投入是XID = 5和DID = 777不是在這種情況下,我的結果集應包含「CCCC」和「DDDD」它應該忽略沒 – user1163306

+0

你可以爲你在where子句中一樣,使用括號表明優先級 – Jason

+0

我在LINQ是新來的XML添加儘可能多的檢查,所以我不能忽略「dID」,如果它不在「Contract」節點中 – user1163306