如何选择XML节点?(使用LINQ、XPath,什么都可以)

本文关键字:XPath LINQ 都可以 什么 使用 节点 何选择 选择 XML | 更新日期: 2023-09-27 17:49:51

我有一个像下面这样的XML:

<Decide Name="MemoryCheck" CommonUnit="MB">
    <Decision CellColor="Red" Status="Critical" Exp="&lt;=100" />
    <Decision CellColor="Yellow" Status="Warning" Exp="&lt;=200 &amp; &gt;100"/>
    <Decision CellColor="Green" Status="OK" Exp="&gt;200" />
</Decide>

对于50mb的输入,返回的输出应该是"Critical-Red"
对于输入142mb,返回的输出应该是"Warning-Yellow"
对于输入212mb,输出返回应为"OK-Green"

如何使用c# ??
Xml名称是"Decide.xml",代码是:

XmlDocument xmldecide = new XmlDocument();    
xmldecide.Load("C:''Decide.xml");
XmlNodeList decidelist = xmldecide.GetElementsbyTagName("Decide");
XmlNode xdecide = decidelist[0];
string input = "50"; // Unit in MB
// Now I have to display the desired O/P "Critical-Red"
string input = "142"; // Unit in MB
// Now I have to display the desired O/P "Warning-Yellow"
string input = "212"; // Unit in MB
// Now I have to display the desired O/P "OK-Green"

如何选择XML节点?(使用LINQ、XPath,什么都可以)

只是一个建议-如果你有控制xml,你应该考虑创建一个最小和最大属性。必须从单个属性中解析出条件信息和整数信息是很难看的。也就是说,假设您不能更改xml,这里有一个解决方案。它假定属性中的条件条件总是采用类似的格式。

    public static string AlertLevel(this XDocument decisionDocument, int size)
    {
        var queryResult = decisionDocument.Descendants("Decision");
        foreach (var item in queryResult)
        {
            var expAttribute = item.Attribute("Exp");
            if (expAttribute == null) continue;
            var returnString = CreateResultString(item);
            int minValue;
            int maxValue;
            if (expAttribute.Value.Contains(">") && expAttribute.Value.Contains("<="))
            {
                //evaluate minValue < size > maxValue
                var stringValue = expAttribute.Value.Replace("<=", string.Empty).Replace(">", string.Empty).Trim();
                var stringValueArray = stringValue.Split('&');
                if (int.TryParse(stringValueArray[1], out minValue) &&
                    int.TryParse(stringValueArray[0], out maxValue))
                {
                    if (minValue < size &&
                        size < maxValue)
                        return returnString;
                }
            }
            else if (expAttribute.Value.Contains(">"))
            {
                //evaluate size > value
                var stringValue = expAttribute.Value.Replace(">", string.Empty).Trim();
                if (int.TryParse(stringValue, out maxValue))
                {
                    if (size > maxValue)
                        return returnString;
                }
            }
            else if (expAttribute.Value.Contains("<="))
            {
                //else evaluate size < value
                var stringValue = expAttribute.Value.Replace("<=", string.Empty).Trim();
                if (int.TryParse(stringValue, out minValue))
                {
                    if (size < minValue)
                        return returnString;
                }
            }
        }
        return "No condition was met!";
    }
    private static string CreateResultString(XElement item)
    {
        var statusAttribute = item.Attribute("Status");
        var returnString = statusAttribute == null ? "Status" : statusAttribute.Value;
        var colorAttribute = item.Attribute("CellColor");
        returnString += colorAttribute == null ? "-Color" : "-" + colorAttribute.Value;
        return returnString;
    }
使用

var xmlDecide =  XDocument.Load("Decide.xml");
Console.WriteLine("50MB: " + xmlDecide.AlertLevel(50));
Console.WriteLine("142MB: " + xmlDecide.AlertLevel(142));
Console.WriteLine("212MB: " + xmlDecide.AlertLevel(212));

编辑:您可以使用相同的代码用于XmlDocument而不是XDocument。只需将"Attribute"更改为"Attributes"。GetNamedItem"answers"Descendants"转换为"GetElementsByTagName"

这很复杂。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string XML = 
                "<Decide Name='"MemoryCheck'" CommonUnit='"MB'">" +
                   "<Decision CellColor='"Red'"    Status='"Critical'" Exp='"&lt;=100'" />" +
                   "<Decision CellColor='"Yellow'" Status='"Warning'"  Exp='"&lt;=200 &amp; &gt;100'"/>" +
                   "<Decision CellColor='"Green'"  Status='"OK'"       Exp='"&gt;200'" />" +
                "</Decide>";
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(XML);
            XmlNodeList  memoryCheck = doc.GetElementsByTagName("Decision");
            foreach(XmlNode decision in memoryCheck)
            {
                Decision newDecision = new Decision();
                Decision.decisions.Add(newDecision);
                newDecision.Cellcolor = decision.Attributes.GetNamedItem("CellColor").Value;
                newDecision.status = decision.Attributes.GetNamedItem("Status").Value;
                newDecision.low = 0;
                newDecision.high = null;
                string exps = decision.Attributes.GetNamedItem("Exp").Value;
                string[] expsArray = exps.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (string exp in expsArray)
                {
                    if(exp.StartsWith("<="))
                    {
                            newDecision.high = int.Parse(exp.Substring(exp.IndexOf("=") + 1));
                    }
                    if(exp.StartsWith(">"))
                    {
                            newDecision.low = int.Parse(exp.Substring(exp.IndexOf(">") + 1));
                    }
                }
            }
            Decision result =  Decision.GetBySize(212);

        }
    }
    public class Decision
    {
        public static List<Decision> decisions = new List<Decision>();
        public string Cellcolor { get; set; }
        public string status { get; set; }
        public int? low { get; set; }
        public int? high {get; set;}
        public static Decision GetBySize(int memory)
        {
            Decision newDecision = null;
            foreach(Decision decision in decisions)
            {
                if (memory >= decision.low)
                {
                    if (decision.high == null)
                    {
                        newDecision = decision;
                        break;
                    }
                    else
                    {
                        if (memory <= decision.high)
                        {
                            newDecision = decision;
                            break;
                        }
                    }
                }
            }
            return newDecision;
        }
    }

}