繁体   English   中英

在 C# 中获取节点 XML

[英]Get node XML in C#

我在 C# 中获取 XML 文档节点时遇到一些问题

我需要制作一个程序,使用户能够编辑每个<ControlItem><LimitValue> <ControlItem>

我已经尝试使用GetElementById获取节点,但它总是返回 null,我不明白为什么。

这是我的 xml 文档:

<?xml version="1.0" encoding="utf-8"?>
<GradeLimits GradeName="1.0305" GradeDescription="P235G1TH (St35.8)" Norm="Trafilspec" BaseElement="Fe">
  <ControlItems>
    <ControlItem Name="C" DisplayUnit="%" Impurity="False">
      <LimitValue Type="UpperWarningLimit" Kind="Absolute" Unit="%">0.17000000178813934</LimitValue>
      <LimitValue Type="UpperAcceptanceLimit" Kind="Absolute" Unit="%">0.18000000715255737</LimitValue>
    </ControlItem>
    <ControlItem Name="Si" DisplayUnit="%" Impurity="False">
      <LimitValue Type="UpperWarningLimit" Kind="Absolute" Unit="%">0.34999999403953552</LimitValue>
      <LimitValue Type="UpperAcceptanceLimit" Kind="Absolute" Unit="%">0.37000000476837158</LimitValue>
    </ControlItem>
    <ControlItem Name="Mn" DisplayUnit="%" Impurity="False">
      <LimitValue Type="LowerWarningLimit" Kind="Absolute" Unit="%">0.40000000596046448</LimitValue>
      <LimitValue Type="UpperWarningLimit" Kind="Absolute" Unit="%">0.800000011920929</LimitValue>
      <LimitValue Type="LowerAcceptanceLimit" Kind="Absolute" Unit="%">0.37999999523162842</LimitValue>
      <LimitValue Type="UpperAcceptanceLimit" Kind="Absolute" Unit="%">0.8399999737739563</LimitValue>
    </ControlItem>
    <ControlItem Name="P" DisplayUnit="%" Impurity="False">
      <LimitValue Type="UpperWarningLimit" Kind="Absolute" Unit="%">0.039999999105930328</LimitValue>
      <LimitValue Type="UpperAcceptanceLimit" Kind="Absolute" Unit="%">0.05000000074505806</LimitValue>
    </ControlItem>
    <ControlItem Name="S" DisplayUnit="%" Impurity="False">
      <LimitValue Type="UpperWarningLimit" Kind="Absolute" Unit="%">0.039999999105930328</LimitValue>
      <LimitValue Type="UpperAcceptanceLimit" Kind="Absolute" Unit="%">0.05000000074505806</LimitValue>
    </ControlItem>
  </ControlItems>
</GradeLimits>

我也试过这样做,但它不起作用:

     foreach (FileInfo file in Files)
            {
                count1++;
                if (count1 == select) {         
                    namefile = Files[select].Name;
                    doc.Load(@"C:\Users\lab\Desktop\copy\spectro\"+namefile);

                    var node = doc.SelectSingleNode("//*[@Name='C']");
                    Console.WriteLine(node);

                }
            }

例如,在这种情况下, <ControlItem Name="C"><LimitValue Type="UpperWarningLimit" ...>0.17000</limitvalue> ,我想给用户设置他们想要的值的可能性。

我无法读取节点,也不知道如何设置此值。

这是一个允许您获取子节点的代码示例:

        XmlDocument doc = new XmlDocument();
        doc.Load(@"C:\Source\Testing\XML\doc.xml");

        var nodeControlItem = doc.SelectSingleNode("//*[@Name='C']");

        var nodeLimitValue = nodeControlItem.SelectSingleNode("//*[@Type='UpperWarningLimit']");

        Console.Write(nodeLimitValue.InnerText);

然后,您的程序可以使用相同的“nodeLimitValue.InnerText”属性来更新 XML 中的值。 (请记住在完成更改后保存您的 XML 文档。

您的代码在正确的轨道上,但是您只获得了 ControlItem 节点,而不是它的子节点 (LimitValue)。 从您的 ControlItem 节点,您可以再次使用 SelectSingleNode 来选择他的子节点,从而能够提取或操作 LimitValue 节点的值。

希望这可以帮助。

编辑:

这是一个扩展的代码示例,可以帮助您更多:

        XmlDocument doc = new XmlDocument();
        doc.Load(@"C:\Source\Testing\XML\doc.xml");

        // This line will select "the first node" in the XML Document with attribute Name="C"
        XmlNode nodeControlItem = doc.SelectSingleNode("//*[@Name='C']");

        // Alternatively, you can accomplish the same thing by iterating through all of the ControlItem nodes to find the one you want:
        foreach (XmlNode node in doc.SelectNodes("/GradeLimits/ControlItems/ControlItem"))
        {
            if (node.Attributes.GetNamedItem("Name").Value == "C")
            {
                nodeControlItem = node;
                break;
            }
        }

        //Now that you have your "C" ControlItem, you can find a child node with Type="UpperWarningLimit"
        XmlNode nodeLimitValue = nodeControlItem.SelectSingleNode("//*[@Type='UpperWarningLimit']");

        //Alternatively, you can accomplish the same thing by iterating through all of the ChildNodes of the ControlItem to find the one you want:
        foreach (XmlNode childNode in nodeControlItem.ChildNodes)
        {
            if (childNode.Attributes.GetNamedItem("Type").Value == "UpperWarningLimit")
            {
                nodeLimitValue = childNode;
                break;
            }
        }

        //Or, another is to iterating through all of the LimitValue child nodes of the ControlItem to find the one you want:
        foreach (XmlNode childNode in nodeControlItem.SelectNodes("./LimitValue"))
        {
            if (childNode.Attributes.GetNamedItem("Type").Value == "UpperWarningLimit")
            {
                nodeLimitValue = childNode;
                break;
            }
        }

        Console.Write(nodeLimitValue.Value);

        // Modify the value of the node
        nodeLimitValue.Value = "0.00000";

        Console.Write(nodeLimitValue.Value);

        // Save the XML document back to disk
        doc.Save(@"C:\Source\Testing\XML\doc.xml");

有关更多详细信息,您应该阅读 XPath 语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM