如何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"
在我想使用 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"