簡體   English   中英

使用LINQ C#獲取節點值xml

[英]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.

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