簡體   English   中英

在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名稱的元素,然后檢查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不止一個,則需要對其進行修改。

這應該工作:

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的元素。如果不是這種情況,則需要進行一些修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM