我认为我的代码'有点'是正确的,但我正在努力使用特定元素的路径的语法。我已经包含了一个简化的XML文件样本,但元素的布局是相同的。
<?xml version="1.0" encoding="utf-8"?>
<Data SomeData which linked to a wepage.>
<DeviceId>Sometext</DeviceId>
<Inputs>
<a:ImageInput>
<a:Cal>
<a:Volt1></Volt1>
<a:Volt2></Volt2>
</a:Cal>
<a:Name>Name1</a:Name>
</a:ImageInput>
<a:ImageInput>
<a:Cal>
<a:Volt1></Volt1>
<a:Volt2></Volt2>
</a:Cal>
<a:Name>Name2</a:Name> <!-- Need to change this element -->
</a:ImageInput>
</Inputs>
</Data>
如您所见,我需要更改a:Name元素,但在第二个a:ImageInput元素中。我已经找到了答案,但我只找到了Xpath改变了根元素部分的例子。
这是我在Main()方法中使用的代码。
public static void ChangeFileXPath()//Changes the value of the node using Xpath
{
XmlDocument xmld = new XmlDocument();
xmld.Load(@"C:\ProgramData\Oxford Instruments NanoAnalysis\Calibration\mics_simulator.xml");
XmlElement name2 = (XmlElement)xmld.SelectSingleNode("/MicsModule/Inputs/a:ImageInput[@a:Name='BSE']");
if (name2 != null)
{
name2.SetAttribute("a:Name", "{{16}}");
}
string AmmendedFile = @"C:\ProgramData\Oxford Instruments NanoAnalysis\XXXX NewXMLReader\Xpath_Mics_Sim.xml";
xmld.Save(AmmendedFile);
}
非常感谢任何帮助。谢谢你的期待。
答案 0 :(得分:1)
/Data/Inputs/a:ImageInput[@a:Name='Name2']
正在寻找具有特定值的属性 a:ImageInput
的{{1}}元素。
但XML有一个元素 a:Name
。
使用XPath
作为元素处理a:Name
然后在代码中设置找到的元素的值。或者切换XML以使用属性。
更新查看了XML
首先:XML无效。例如。 /Data/Inputs/a:ImageInput/a:Name[text()='Name2']
:结束名称需要与开头匹配。
第二:虽然技术上可以在没有命名空间的情况下使用XML(它们是原始标准的可选扩展),但.NET中的XML支持将“a:”视为需要命名空间声明(这适用于<a:Volt2></Volt2>
这是所有不同XML API的基础解析器:XmlReader
,XmlDocument
和XPathDocument
)。
因此,您需要在文档中添加XML命名空间声明(并更正上面提到的不匹配的关闭元素):
XDocument
鉴于此,XML将加载,并可以进行操作。通过对上述XPath的更正以及与XML的匹配,以下工作:
使用System; 使用System.Xml;
<?xml version='1.0' encoding='utf-8'?>
<Data xmlns:a='this should be a uri'>
<DeviceId>Sometext</DeviceId>
<Inputs>
<a:ImageInput>
<a:Cal>
<a:Volt1></a:Volt1>
<a:Volt2></a:Volt2>
</a:Cal>
<a:Name>Name1</a:Name>
</a:ImageInput>
<a:ImageInput>
<a:Cal>
<a:Volt1></a:Volt1>
<a:Volt2></a:Volt2>
</a:Cal>
<a:Name>Name2</a:Name> <!-- Need to change this element -->
</a:ImageInput>
</Inputs>
</Data>
答案 1 :(得分:0)
如果要将SelectSingleNode与该XPath一起使用,则必须通过提供Namespacemanager来包含命名空间。你需要有一个有效的XML文件,我在这里给出了截图中的位和你的XPath
创建MCVE此代码使用arr = df.values.T
的文本值BSE
更改节点。请注意,我在此假设您的XML没有名称空间和前缀。相反,我通过XmlNamespaceManager
{{16}}