gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:45 25 4
gpt4 key购买 nike

我有一个如下所示的 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>

对于 50 MB 的输入,返回的输出应为“Critical-Red”
对于 142 MB 的输入,返回的输出应为“Warning-Yellow”
对于 212 MB 的输入,返回的输出应该是“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,您应该考虑创建一个 min 和 max 属性。必须从单个属性中解析出条件和整数信息是很丑陋的。也就是说,假设您不能更改 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”并将“Descendants”更改为“GetElementsByTagName”

关于c# - 如何选择 XML 节点? (使用 LINQ、XPath,什么都可以),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30348509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com