2014-03-19 65 views
1

在下面的XML示例中,可能會有許多「Element」條目。對於每個「元素」,只能有一個「系統」條目,但在同一個「元素」內的「系統」條目旁邊可能會有很多「設備」條目。LINQ to XML:選擇以其他值爲條件的值

我想知道每個「」元素',我怎麼構建一個LINQ在C#中的XML查詢,可以選擇如下數據:

每個「」元素「」,其中「」系統''CONTAINS''1A7'',僅返回那些'Device'' - ''InfoB'''''Settings'' - ''name''值也有一個''Device'' - ''InfoA' ' - ''Core''的值爲FALSE,然後將這些匹配值放入List中。

上週,LINQ已經證明對我來說非常困難。我沒有發佈代碼片段,因爲我認爲我已經通過(並且失敗了)的大量代碼片段中的任何一個都不會比上面的查詢概要更清楚地說明這個問題。我非常感謝這方面的幫助,我希望上面的查詢對於這裏的LINQ to XML專家來說相當簡單。

XML:

<?xml version="1.0" standalone="yes" ?> 
<Base_TP> 
    <Element> 
    <System> 
     <id>341A7</id> 
    </System> 
    <Device> 
     <InfoA> 
     <id>12</id> 
     <Core>TRUE</Core> 
     </InfoA> 
     <InfoB> 
     <Settings> 
      <type>0</type> 
      <name>DeviceA</name> 
     </Settings> 
     </InfoB> 
    </Device> 
    <Device> 
     <InfoA> 
     <id>13</id> 
     <Core>FALSE</Core> 
     </InfoA> 
     <InfoB> 
     <Settings> 
      <type>0</type> 
      <name>DeviceB</name> 
     </Settings> 
     </InfoB> 
    </Device> 
    <Device> 
     <InfoA> 
     <id>14</id> 
     <Core>FALSE</Core> 
     </InfoA> 
     <InfoB> 
     <Settings> 
      <type>0</type> 
      <name>DeviceC</name> 
     </Settings> 
     </InfoB> 
    </Device> 
    </Element> 
</Base_TP> 
+0

那麼,請不要張貼你現在有一個代碼段。即使它完全錯誤,這是一個比沒有更好的起點。 –

回答

1
var doc = XDocument.Load("Input.xml"); 

var values = from e in doc.Root.Elements("Element") 
      where ((string)e.Element("System").Element("id")).Contains("1A7") 
      from d in e.Elements("Device") 
      where !(bool)d.Element("InfoA").Element("Core") 
      select (string)d.Element("InfoB").Element("Settings").Element("name"); 

返回IEnumerable<string>。撥打ToString即可獲得List<string>的物化結果。

-1

我打算在visual basic中這樣做,因爲它具有本地支持xml的內聯,但翻譯非常簡單。

Dim elements = From e In xml...<Element> 
       Where e.<System>.<Id>.Value.Contains("1A7") 
       Select e 
Dim deviceBs = (From e In elements 
       Where e.<Device>.<InfoA>.<Core>.Value = "FALSE" 
       Select e.<Device>.<InfoB>.<name>.Value).ToList 
+0

謝謝你。這可能與VB無關,但是因爲這個問題已經在C#的這個線程中被回答了兩次,所以我認爲看看它如何在VB中完成是非常有趣的(如果它在F#中是可行的, IronPython等將很高興見到)。如果在C#中有其他不同的語法方法可以做到這一點,那麼看起來也很迷人。 – user3435759

0
XDocument xDoc = XDocument.Load("System.xml"); 
List<string> result = xDoc.Descendants("Element").Where(el => el.Element("System").Element("id").Value.Contains("1A7")).SelectMany(e => e.Descendants("Device").Where(d => d.Element("InfoA").Element("Core").Value.ToUpper() == "FALSE").Select(x => x.Element("InfoB").Element("Settings").Element("name").Value)).ToList(); 
+0

也非常感謝這個答案,因爲我現在正在努力探索各種LINX to XML技術,所以很高興看到這兩種不同的和優秀的方法來實現這一點。我在5分鐘內從你和Marcin的答案中學到了更多,我從一週的其他StackOverflow搜索中學到了知識,所以這對我今天在5或6個基於這些答案的查詢中非常有用。謝謝。 – user3435759