C#使用Xpath更改XML值

时间:2018-02-07 08:20:01

标签: c# xml xpath visual-studio-2017

谁能帮助我吗?我对C#很新,但到了那里。 我已经设置了一个任务,从XML文件中检索数据,更改数据,并使用Xpath将其保存在另一个位置。

我认为我的代码'有点'是正确的,但我正在努力使用特定元素的路径的语法。我已经包含了一个简化的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);
    }

非常感谢任何帮助。谢谢你的期待。

2 个答案:

答案 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的基础解析器:XmlReaderXmlDocumentXPathDocument)。

因此,您需要在文档中添加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}}