[英]Get node value xml with LINQ c#
我無法獲得此XML節點的值。
我需要獲取<LimitValue>
值,並為用戶提供更改它的可能性。
我已經嘗試過此解決方案,但是它不起作用:
namefile = Files[select].Name;
XDocument document = XDocument.Load(@"C:\Users\lab\Desktop\copy\spectro\" + namefile);
Console.WriteLine("Inserisci lelemento chimico da modificare:");
var chimical = Console.ReadLine();
var nodes = (from n in document.Descendants("ControlItems")
where n.Element("ControlItem").Attribute("Name").Value == chimical
select new
{
nodeLimitValueLW = (string)n.Element("LimitValue").Attribute("Type") == "LowerWarningLimit",
nodeLimitValueUW = (string)n.Element("LimitValue").Attribute("Type") == "UpperWarningLimit",
nodeLimitValueLA = (string)n.Element("LimitValue").Attribute("Type") == "LowerAcceptanceLimit",
nodeLimitValueUA = (string)n.Element("LimitValue").Attribute("Type") == "UpperAcceptanceLimit"
}).ToList();
foreach (var n in nodes)
{
Console.WriteLine(n.nodeLimitValueLW);
Console.WriteLine(n.nodeLimitValueUW);
Console.WriteLine(n.nodeLimitValueLA);
Console.WriteLine(n.nodeLimitValueUA);
}
這是我的XML:
<GradeLimits GradeName="1.5217" GradeDescription="20MnV6" Norm="TXC03" BaseElement="Fe">
<ControlItems>
<ControlItem Name="C" DisplayUnit="%">
<LimitValue Type="LowerWarningLimit" Kind="Absolute" Unit="%">0.15999999642372131</LimitValue>
<LimitValue Type="UpperWarningLimit" Kind="Absolute" Unit="%">0.2199999988079071</LimitValue>
<LimitValue Type="LowerAcceptanceLimit" Kind="Absolute" Unit="%">0.15000000596046448</LimitValue>
<LimitValue Type="UpperAcceptanceLimit" Kind="Absolute" Unit="%">0.23000000417232513</LimitValue>
</ControlItem>
<ControlItem Name="Si" DisplayUnit="%">
<LimitValue Type="LowerWarningLimit" Kind="Absolute" Unit="%">0.10000000149011612</LimitValue>
<LimitValue Type="UpperWarningLimit" Kind="Absolute" Unit="%">0.5</LimitValue>
<LimitValue Type="LowerAcceptanceLimit" Kind="Absolute" Unit="%">0.090000003576278687</LimitValue>
<LimitValue Type="UpperAcceptanceLimit" Kind="Absolute" Unit="%">0.51999998092651367</LimitValue>
</ControlItem>
<ControlItem Name="Pb" DisplayUnit="%">
<LimitValue Type="UpperWarningLimit" Kind="Absolute" Unit="%">0.05000000074505806</LimitValue>
<LimitValue Type="UpperAcceptanceLimit" Kind="Absolute" Unit="%">0.05000000074505806</LimitValue>
</ControlItem>
</ControlItems>
</GradeLimits>
例如:
用戶想要使用屬性Name="Si"
編輯<ControlItem>
的<LimitValue>
他們將在控制台中鍵入“ Si”,並且我需要遍歷所有<ControlItem>
,直到找到具有<ControlItem>
Name="Si"
屬性的<ControlItem>
為止。 然后,我需要使用所有<LimitValue>
並提供對其進行編輯的可能性。
我希望我已經解釋清楚了。 先謝謝您的幫助。
沒有完全使用Linq,但是可以滿足您的需求。
public class Limits
{
public string LowerWarningLimit = "";
public string UpperWarningLimit = "";
public string LowerAcceptanceLimit = "";
public string UpperAcceptanceLimit = "";
}
public static void GetLimits(string nameFile)
{
XDocument document = XDocument.Load(nameFile);
if (document == null)
{
Console.WriteLine("Document not found.");
return;
}
XElement root = document.Descendants("ControlItems").FirstOrDefault();
if (root == null)
{
Console.WriteLine("Could not find ControlItems.");
return;
}
Console.WriteLine("Inserisci lelemento chimico da modificare:");
var chimical = Console.ReadLine();
XElement nameSearch = root.Descendants("ControlItem").FirstOrDefault(x => x.Attribute("Name") != null && x.Attribute("Name").Value.ToLower() == chimical.ToLower());
if (nameSearch == null)
{
Console.WriteLine("Name not found.");
return;
}
Limits limits = new Limits();
foreach (XElement elements in nameSearch.Descendants())
{
string typeResult = elements.Attribute("Type").Value;
if (typeResult == null)
{
continue;
}
switch (typeResult)
{
case "LowerWarningLimit":
limits.LowerWarningLimit = elements.Value;
break;
case "UpperWarningLimit":
limits.UpperWarningLimit = elements.Value;
break;
case "LowerAcceptanceLimit":
limits.LowerAcceptanceLimit = elements.Value;
break;
case "UpperAcceptanceLimit":
limits.UpperAcceptanceLimit = elements.Value;
break;
}
}
Console.WriteLine(limits.LowerWarningLimit);
Console.WriteLine(limits.UpperWarningLimit);
Console.WriteLine(limits.LowerAcceptanceLimit);
Console.WriteLine(limits.UpperAcceptanceLimit);
}
static void Main(string[] args)
{
string xmlFilePath = @"C:\Users\vincenzo.lanera\Desktop\test.xml";
XmlDocument document = new XmlDocument();
document.Load(xmlFilePath);
Console.WriteLine("Inserisci l'elemento chimico da modificare:");
var chimical = Console.ReadLine();
//Searches the limit values of the selected element
XmlNodeList limitValues = document.SelectNodes($"//ControlItem[@Name='{chimical}']/LimitValue");
//Prints all limit values
Console.WriteLine($"Limit values of {chimical}:");
foreach (XmlNode limVal in limitValues)
{
Console.WriteLine($"{limVal.Attributes["Type"].Value} {limVal.InnerText}");
};
//Ask the user wich limit value wants to edit
Console.WriteLine("Inserisci il limit value da modificare:");
var limitValueToEdit = Console.ReadLine();
//Ask the user the new value
Console.WriteLine("Inserisci il nuovo valore:");
var newVal = Console.ReadLine();
//Edit the limit value
var nodeToEdit = document.SelectSingleNode($"//ControlItem[@Name='{chimical}']/LimitValue[@Type='{limitValueToEdit}']");
nodeToEdit.InnerText = newVal;
//Save the changes to the xml file
document.Save(xmlFilePath);
}
}
如果用戶插入無效的文本,您還應該處理錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.