2017-06-01 61 views
0

我有以下xml架構上我想用linq查詢2屬性的位置。我已經四處搜尋,但還沒有找到正確的解決方案。如何選擇多個屬性

<Object class="MA" Name="Sample"> 
    <bist name="act">false</bist> 
    <bist name="Dynamic">1234</bist> 
    <bist name="Fast">false</bist> 
    <bist name="plane">false</bist> 
    <bist name="Tnl">2232</bist> 
</Object> 

對於上面的XML,收到「動態」的價值,並將其與oldTnl變量比較後,如果相等,我要選擇或得到「TNL」值(2232)。

目前,我正在測試這個代碼,併成功獲得「動態」的價值,但我真的想要「Tnl」的價值。

private void mGetTnlFromXML(string oldTnl) 
    { 
     XDocument doc = XDocument.Load("sample.xml"); 

     var bt = from p in doc.Descendants() 
        where (string)p.Attribute("name") == "Dynamic" 
        select p; 

     foreach (string b in bt) 
     { 
      if (b == oldTnl) 
      { 
       MessageBox.Show(b.ToString()); 
      } 
     } 
    } 

喜歡的東西:

private void mGetTnlFromXML(string oldTnl) 
    { 
     XDocument doc = XDocument.Load("sample.xml"); 

     var bt = from p in doc.Descendants() 
        where (string)p.Attribute("name") == "Dynamic" 
        //is there are way i can also find "Tnl" here and use 
        //later? 
        select p; //or select "Tnl" here. 

     foreach (string b in bt) 
     { 
      if (b == oldTnl) 
      { 
       //select "Tnl" value (2232) 
       //use "Tnl" value (2232) 
       //do something.... 
      } 
     } 
    } 

預先感謝您......我還在學習的LinQ :)。


更新XML:

<Root> 
    <Data> 
    <Object class="MA" Name="Sample"> 
     <bist name="act">false</bist> 
     <bist name="Dynamic">1234</bist> 
     <bist name="Fast">false</bist> 
     <bist name="plane">false</bist> 
     <bist name="Tnl">2232</bist> 
    </Object> 
    </Data> 
</Root> 
+0

所以,你想要的'bist'元素的值,其中'名字在...處致敬是**「Tnl」**並且存在一個兄弟'bist'元素,其具有值爲**「dynamic」**的'name'屬性? –

+0

我需要動態比較,然後我會得到Tnl。如果動態不相等或不存在,它不會執行任何操作。 – mygtwo

回答

0

在我看來,你想這樣的:

private void mGetTnlFromXML(string oldTnl) 
{ 
    XDocument doc = XDocument.Load("sample.xml"); 
    var dynamic = doc.Root.Elements("bist").Where(x => x.Attribute("name").Value == "dynamic").First().Value; 
    if (dynamic == oldTnl) 
    { 
     var tnl = doc.Root.Elements("bist").Where(x => x.Attribute("name").Value == "Tnl").First().Value; 
     MessageBox.Show(tnl); 
    }; 
} 

那你曾表示你的問題了整個XML的假設下的。如果它只是更大的XML文件的一部分,則需要顯示整個事情。


鑑於你的XML更像是這樣的:

<Root> 
    <Data> 
    <Object class="MA" Name="Sample"> 
     <bist name="act">false</bist> 
     <bist name="Dynamic">1234</bist> 
     <bist name="Fast">false</bist> 
     <bist name="plane">false</bist> 
     <bist name="Tnl">2232</bist> 
    </Object> 
    </Data> 
</Root> 

用該程序可能會更喜歡這樣的:

private void mGetTnlFromXML(string oldTnl) 
{ 
    XDocument doc = XDocument.Load("sample.xml"); 
    foreach (var element in doc.Root.Element("Data").Elements("Object")) 
    { 
     var dynamic = element.Elements("bist").Where(x => x.Attribute("name").Value == "dynamic").First().Value; 
     if (dynamic == oldTnl) 
     { 
      var tnl = element.Elements("bist").Where(x => x.Attribute("name").Value == "Tnl").First().Value; 
      MessageBox.Show(tnl); 
     }; 
    } 
} 
+0

這似乎沒問題。我會嘗試。謝謝。整個XML只是一遍又一遍地包含相同的「對象」。 – mygtwo

+0

我不斷收到「var dynamic ....」中的「sequence has no elements」錯誤,我認爲它與if語句中的「var tnl ....」一樣。 – mygtwo

+0

@mygtwo - 是的,這是因爲您發佈的XML不是完整的XML。您需要提供正確的XML以獲取正確的代碼。 – Enigmativity

0

使用Enigmativity提供的XML,我們可以將其減少到XPath行:

XDocument xml = XDocument.Parse(@" 
<Root> 
    <Object class=""MA"" Name=""Sample""> 
    <bist name = ""act"" > false </bist > 
    <bist name = ""Dynamic"" > 1234 </bist > 
    <bist name = ""Fast"" > false </bist > 
    <bist name = ""plane"" > false </bist > 
    <bist name = ""Tnl"" > 2232 </bist > 
    </Object > 
    <Object class= ""MA"" Name = ""Sample"" > 
     <bist name = ""act"" > false </bist > 
     <bist name = ""Dynamic"" > 1234 </bist > 
     <bist name = ""Fast"" > false </bist > 
     <bist name = ""plane"" > false </bist > 
     <bist name = ""Tnl"" > 2232 </bist > 
    </Object > 
</Root >"); 

xml.XPathSelectElements("//Object[bist[@name='Dynamic']]/bist[@name='Tnl']").Dump(); 

這相當於:

  • //Object[...] - 發現其中有 「對象」 ......
  • bist[@name='Dynamic'] - 與ATTRIB 「名稱」 等於 「動態」 一 「BIST」 元素
  • /bist[...] - 那麼採取「BIST」元素在其下有一個「對象」 ......
  • @name='Tnl' - 屬性「名」等於「TNL」
+0

謝謝......我會試試看。 :) – mygtwo

+0

嗨,這工作,但它不是解決這個特定問題。再次感謝,我也從你的貢獻中學到了...... :) – mygtwo