在XML中,用c#检查子节点是否包含特定的值

本文关键字:包含特 是否 子节点 检查 XML | 更新日期: 2023-09-27 18:08:37

我得到一些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存在,我需要检查下一个节点(value),并检查它是否等于0或1。

如果它等于0,我需要向屏幕(网页)输出一条消息。

我继承了原始代码,它是用c# .net编写的-谁能帮助我,因为它不是我熟悉的语言?

我从这个开始,基于其他一些代码,但我不确定下一步该去哪里。

if (eleName.Contains("cf_item")) {
     XmlNode nodes = eleList[i].ChildNodes;
}

在XML中,用c#检查子节点是否包含特定的值

首先,获取具有pair名称的第一个元素,然后检查name属性是否包含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,则需要修改它

使用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 . . .

应该可以:

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的pair元素。