Specflow C# - 加载/编辑/保存 xml 文件

Posted

技术标签:

【中文标题】Specflow C# - 加载/编辑/保存 xml 文件【英文标题】:Specflow C# - load/edit/save xml file 【发布时间】:2021-03-28 04:42:43 【问题描述】:

我使用 Visual Studio 2019,我想加载、编辑和保存 xml 文件。

xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<Firstdelivery25 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.acm.nl/Operations/2018/09">
    <Firstdelivery>
        <MessageId xmlns="http://www.acm.nl/DataModel/2018/09">
            <Source>ABC</Source>
        </MessageId>
    </Firstdelivery>
</Firstdelivery25>

Visual Studio 中的代码:

using System.Linq;
using System.Xml.Linq;
using System.Xml;
using TechTalk.SpecFlow;
XDocument xdoc = XDocument.Load(@"C:\\XML files\\25.xml");
            var element = xdoc.Elements("Source").FirstOrDefault();
            if (element != null)
            
                element.Value = "DEF";
            

            xdoc.Save(@"C:\\VB_25.xml");

当我执行此操作时,测试成功通过。 但是,当我打开新创建的 VB_25.xml 文件时,旧值仍然存在。

任何帮助/建议/提示将不胜感激。

【问题讨论】:

元素 Bron 为空,所以没有任何改变。 XML 元素 Bron 不存在,因此没有任何更改。您需要获取Firstdelivery25,然后从中获取Firstdelivery,然后是MessageId,然后是source,然后更改它的值。或者,您可以创建一个表示此 XML 的 C# 类并将其反序列化,更改属性的值并再次序列化它 我的错误。我已将“xdoc.Elements("Bron")" 更改为 xdoc.Elements("Source")。我再次运行它,但新文件仍然显示旧值。 【参考方案1】:

你可以试试modifty XML Data by using XPathNavigator。

这是一个简单的演示,您可以参考。

http://www.acm.nl/DataModel/2018/09MessageIdxmlns

XmlDocument document = new XmlDocument();
document.Load("test.xml");
XPathNavigator navigator = document.CreateNavigator();

XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("id", "http://www.acm.nl/DataModel/2018/09");

foreach (XPathNavigator nav in navigator.Select("//id:Source", manager))

    nav.SetValue("Tessssssst");


document.Save(@"new.xml");

【讨论】:

@Vinni 很高兴听到这个消息。如果这个答案有帮助,也许你可以vote on / accept it。 @Vinni 要获取随机数,answer 对您有帮助吗? 我知道我已经接受了这个答案,这对我有很大帮助。但是,如果我希望 'nav.SetValue("Tessssssst")' 是 100000000 和 999999999 之间的随机数,也许您对此有一些额外的建议。提前谢谢。如果需要,我将为此创建一个新主题。 谢谢我去看看。【参考方案2】:

var element = xdoc.Elements("Source").FirstOrDefault();

鉴于您提供的 XML elements 将始终为空,因此您对 XML 什么都不做,这就是结果看起来像输入的原因。

原因 1:Elements() 仅在寻找直系子代,&lt;Source&gt; 不是您文档中的直系子代。

见https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xcontainer.elements?view=net-5.0

原因 2:&lt;Source&gt; 标记的命名空间与文档本身不同,因此查询在错误的命名空间中查找。

解决方案:

XNamespace ns = "http://www.acm.nl/DataModel/2018/09";
var element = xdoc.Descendants(ns + "Source").FirstOrDefault();

查看https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xcontainer.descendants?view=net-5.0,它正在搜索包括他们的孩子在内的孩子。

如果您希望节点存在,我还建议使用First() 而不是FirstOrDefault()。这样你就会得到一个异常,它会告诉你问题的原因。

【讨论】:

确实尝试使用“var element = xdoc.Descendants("Source").FirstOrDefault();”。新文件仍然显示旧值。感谢链接。 错过了命名空间,抱歉。固定。

以上是关于Specflow C# - 加载/编辑/保存 xml 文件的主要内容,如果未能解决你的问题,请参考以下文章

C# Specflow:如何在另一个文件夹的类中调用具有动态表作为参数的方法

想要在 Specflow C# 中对具有多个场景的每个功能文件只执行一次背景标记

SpecFlow 测试无法使用 Playwright.NET 运行

Specflow:为许多场景大纲维护一个示例表

在 C# 中保存每个用户选项的最佳方法

C# 如何使datagridview中的单元格处于可编辑