在XML中,用C#检查子节点是否包含特定值
In XML, check if child nodes contain specific values with C#
我正在取回一些 XML,这是其中的一部分:
<pair name="cf_item7" type="pair">
<pair name="cf_id" type="integer">34</pair>
<pair name="value" type="string">0</pair>
</pair>
XML 中有许多对。我需要检查的部分的名称始终以 cf_item* 开头,但这可能是 cf_item7、cf_item6 或任何其他数字。
我需要检查其中一个 cf_item* 部分,以及它是否有一个 cf_id,内容等于 34(它总是 34)。
如果34存在,我需要检查下一个节点(值),检查它是否等于0或1。
如果等于0,我需要向屏幕(网页)输出一条消息。
我继承了原始代码,它是用 C# .net 编写的 - 任何人都可以提供帮助,因为它不是我熟悉的语言?
我从这个开始,基于其他一些代码,但我不确定下一步该去哪里。
if (eleName.Contains("cf_item")) {
XmlNode nodes = eleList[i].ChildNodes;
}
使用System.Xml.Linq.XElement
,你可以这样做:
namespace ConsoleApplication4
{
using System;
using System.Linq;
using System.Xml.Linq;
internal class Program
{
private static void Main(string[] args)
{
var xmlDocument = XElement.Load(@"c:\tmp\foo.xml");
// Loop over all elements having a "name" attribute starting with "cf_item".
foreach (var pairElement in xmlDocument.Elements().Where(x => x.Attributes().Any(y => y.Name == "name" && y.Value.StartsWith("cf_item"))))
{
// Is there a child element, having a "name" attribute set to "cf_id" with a value of "34"?
if (pairElement.Elements().Any(x => x.Attributes().Any(y => y.Name == "name" && y.Value == "cf_id") && x.Value == "34"))
{
// Fetch the single element with a "name" attribute set to "value".
var valueElement = pairElement.Elements().Single(x => x.Attributes().Any(y => y.Name == "name" && y.Value == "value"));
// Output the value of it!
Console.WriteLine(valueElement.Value);
}
else
{
Console.WriteLine("No cf_id set to 34.");
}
}
}
}
}
XML
<root>
<pair name="cf_item7" type="pair">
<pair name="cf_id" type="integer">34</pair>
<pair name="value" type="string">0</pair>
</pair>
<pair name="cf_item8" type="pair">
<pair name="cf_id" type="integer">34</pair>
<pair name="value" type="string">1</pair>
</pair>
<pair name="cf_item9" type="pair">
<pair name="value" type="string">0</pair>
</pair>
</root>
输出
0
1
No cf_id set to 34.
Press any key to continue . . .
首先,获取名称为pair
的第一个元素,然后检查名称属性是否包含cf_item
。
如果是,则从第一个元素中获取名称为 pair
的所有元素。
结果将在 IEnumerable<XElement>
中,然后您可以检查第一个元素是否包含 34
以及第二个元素是否包含 0
。
代码将是这样的:
XDocument xmldata = XDocument.Load(xmlFile);
XElement node = xmldata.Element("pair");
if (node.Attribute("name").Value.Contains("cf_item"))
{
IEnumerable<XElement> nextElmts = node.Elements("pair");
if (nextElmts.ElementAt(0).Attribute("name").Value.Contains("cf_id"))
{
if ((Convert.ToInt32(nextElmts.ElementAt(0).Value) == 34))
{
if (Convert.ToInt32(nextElmts.ElementAt(1).Value) == 0)
{
//do what you want here
Console.WriteLine("it's 0");
}
}
}
}
注意:这仅适用于一个 cf_item。如果cf_item
大于1,则需要修改。
这应该有效:
var valueAfter34 = (from e in doc.Descendants("pair")
where e.Attribute("name").Value.StartsWith("cf_item")
let itemPairs = e.Descendants()
from idElement in itemPairs
where idElement.Attribute("name").Value.Equals("cf_id") &&
idElement.Value == "34"
select idElement.ElementsAfterSelf().FirstOrDefault().Value).FirstOrDefault();
if (valueAfter34 == "0")
{
// show message
}
它假设有一对元素 cf_id 34。如果不是这种情况,它应该需要一些摆弄。
我正在取回一些 XML,这是其中的一部分:
<pair name="cf_item7" type="pair">
<pair name="cf_id" type="integer">34</pair>
<pair name="value" type="string">0</pair>
</pair>
XML 中有许多对。我需要检查的部分的名称始终以 cf_item* 开头,但这可能是 cf_item7、cf_item6 或任何其他数字。
我需要检查其中一个 cf_item* 部分,以及它是否有一个 cf_id,内容等于 34(它总是 34)。
如果34存在,我需要检查下一个节点(值),检查它是否等于0或1。
如果等于0,我需要向屏幕(网页)输出一条消息。
我继承了原始代码,它是用 C# .net 编写的 - 任何人都可以提供帮助,因为它不是我熟悉的语言?
我从这个开始,基于其他一些代码,但我不确定下一步该去哪里。
if (eleName.Contains("cf_item")) {
XmlNode nodes = eleList[i].ChildNodes;
}
使用System.Xml.Linq.XElement
,你可以这样做:
namespace ConsoleApplication4
{
using System;
using System.Linq;
using System.Xml.Linq;
internal class Program
{
private static void Main(string[] args)
{
var xmlDocument = XElement.Load(@"c:\tmp\foo.xml");
// Loop over all elements having a "name" attribute starting with "cf_item".
foreach (var pairElement in xmlDocument.Elements().Where(x => x.Attributes().Any(y => y.Name == "name" && y.Value.StartsWith("cf_item"))))
{
// Is there a child element, having a "name" attribute set to "cf_id" with a value of "34"?
if (pairElement.Elements().Any(x => x.Attributes().Any(y => y.Name == "name" && y.Value == "cf_id") && x.Value == "34"))
{
// Fetch the single element with a "name" attribute set to "value".
var valueElement = pairElement.Elements().Single(x => x.Attributes().Any(y => y.Name == "name" && y.Value == "value"));
// Output the value of it!
Console.WriteLine(valueElement.Value);
}
else
{
Console.WriteLine("No cf_id set to 34.");
}
}
}
}
}
XML
<root>
<pair name="cf_item7" type="pair">
<pair name="cf_id" type="integer">34</pair>
<pair name="value" type="string">0</pair>
</pair>
<pair name="cf_item8" type="pair">
<pair name="cf_id" type="integer">34</pair>
<pair name="value" type="string">1</pair>
</pair>
<pair name="cf_item9" type="pair">
<pair name="value" type="string">0</pair>
</pair>
</root>
输出
0
1
No cf_id set to 34.
Press any key to continue . . .
首先,获取名称为pair
的第一个元素,然后检查名称属性是否包含cf_item
。
如果是,则从第一个元素中获取名称为 pair
的所有元素。
结果将在 IEnumerable<XElement>
中,然后您可以检查第一个元素是否包含 34
以及第二个元素是否包含 0
。
代码将是这样的:
XDocument xmldata = XDocument.Load(xmlFile);
XElement node = xmldata.Element("pair");
if (node.Attribute("name").Value.Contains("cf_item"))
{
IEnumerable<XElement> nextElmts = node.Elements("pair");
if (nextElmts.ElementAt(0).Attribute("name").Value.Contains("cf_id"))
{
if ((Convert.ToInt32(nextElmts.ElementAt(0).Value) == 34))
{
if (Convert.ToInt32(nextElmts.ElementAt(1).Value) == 0)
{
//do what you want here
Console.WriteLine("it's 0");
}
}
}
}
注意:这仅适用于一个 cf_item。如果cf_item
大于1,则需要修改。
这应该有效:
var valueAfter34 = (from e in doc.Descendants("pair")
where e.Attribute("name").Value.StartsWith("cf_item")
let itemPairs = e.Descendants()
from idElement in itemPairs
where idElement.Attribute("name").Value.Equals("cf_id") &&
idElement.Value == "34"
select idElement.ElementsAfterSelf().FirstOrDefault().Value).FirstOrDefault();
if (valueAfter34 == "0")
{
// show message
}
它假设有一对元素 cf_id 34。如果不是这种情况,它应该需要一些摆弄。