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