Specflow C# - load/edit/save xml 文件
Specflow C# - load/edit/save xml file
我正在使用 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 文件时,旧值仍然存在。
任何 help/suggestions/tips 将不胜感激。
var element = xdoc.Elements("Source").FirstOrDefault();
鉴于您提供的 XML elements
将始终为 null,因此您对 XML 什么也不做,这就是为什么结果看起来像输入的原因。
原因 1:Elements()
仅在寻找直接 children 而 <Source>
不是您文档中的直接 child。
见https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xcontainer.elements?view=net-5.0
原因 2:<Source>
标记的命名空间与文档本身的命名空间不同,因此查询在错误的命名空间中查找。
解决方案:
XNamespace ns = "http://www.acm.nl/DataModel/2018/09";
var element = xdoc.Descendants(ns + "Source").FirstOrDefault();
查看正在搜索 children 的 https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xcontainer.descendants?view=net-5.0,包括他们的 children。
如果您希望节点存在,我也建议使用 First()
而不是 FirstOrDefault()
。这样你就会得到一个异常,它会告诉你问题的原因。
你可以试试modifty XML Data by using XPathNavigator.
这里有一个简单的demo,大家可以参考一下。
http://www.acm.nl/DataModel/2018/09
是 MessageId
的 xmlns
。
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");
我正在使用 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 文件时,旧值仍然存在。
任何 help/suggestions/tips 将不胜感激。
var element = xdoc.Elements("Source").FirstOrDefault();
鉴于您提供的 XML elements
将始终为 null,因此您对 XML 什么也不做,这就是为什么结果看起来像输入的原因。
原因 1:Elements()
仅在寻找直接 children 而 <Source>
不是您文档中的直接 child。
见https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xcontainer.elements?view=net-5.0
原因 2:<Source>
标记的命名空间与文档本身的命名空间不同,因此查询在错误的命名空间中查找。
解决方案:
XNamespace ns = "http://www.acm.nl/DataModel/2018/09";
var element = xdoc.Descendants(ns + "Source").FirstOrDefault();
查看正在搜索 children 的 https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xcontainer.descendants?view=net-5.0,包括他们的 children。
如果您希望节点存在,我也建议使用 First()
而不是 FirstOrDefault()
。这样你就会得到一个异常,它会告诉你问题的原因。
你可以试试modifty XML Data by using XPathNavigator.
这里有一个简单的demo,大家可以参考一下。
http://www.acm.nl/DataModel/2018/09
是 MessageId
的 xmlns
。
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");