如何select多个属性

How to select multiple attributes

在我想使用 linq 查询 2 个属性的地方,我有以下 xml 模式。我四处搜索但没有找到正确的解决方案。

<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,得到"Dynamic"的值后和oldTnl变量比较,如果相等,我想select或者得到"Tnl"的值(2232).

目前,我正在使用此代码进行测试并成功获得 "Dynamic" 的值,但我真的想要 "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>

我觉得你想要这个:

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);
        };
    }
}

使用提供的 Xml Enigmativity,我们可以将其简化为一行 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[...] - 找到具有....
  • 的 "Object"
  • bist[@name='Dynamic'] - 属性 "name" 等于 "Dynamic"
  • 的 "bist" 元素
  • /bist[...] - 然后取 "Object" 下的 "bist" 元素,其中有...
  • @name='Tnl' - 属性 "name" 等于 "tnl"