在 C# 中使用 Xmldocument 修改 xml

Posted

技术标签:

【中文标题】在 C# 中使用 Xmldocument 修改 xml【英文标题】:Modify xml with Xmldocument in C# 【发布时间】:2021-11-28 22:27:24 【问题描述】:

我正在尝试按照此处 How to modify existing XML file with XmlDocument and XmlNode in C# 的另一篇文章中的说明编辑 xml 文档的值。

这是我的代码

XmlDocument xml = new XmlDocument();
        xml = xml.Load(@"https://www.aade.gr/sites/default/files/2020-09/SampleXML_1.1%20%20%28%CE%A4%CE%99%CE%9C-%CE%A0%CE%A9%CE%9B%CE%97%CE%A3%CE%97%CE%A3_%CE%91%CE%A5%CE%A4%CE%9F%CE%A4%CE%99%CE%9C%29%20.xml");

        XmlNodeList aNodes = xml.SelectNodes("/InvoicesDoc/invoice/issuer/vatNumber");


        foreach (XmlNode aNode in aNodes)
        
            XmlAttribute vatAttribute = aNode.Attributes["vatNumber"];
            vatAttribute.Value = "123456789";
            
        

        xml.Save(@"C:\Users\Kostas\Desktop\mydata\infinal.xml");

我的问题是 XmlNodeList aNodes 将返回空;我试图将 xml.SelectNodes("/InvoicesDoc/invoice/issuer/vatNumber") 更改为 xml.SelectNodes("/InvoicesDoc/invoice/issuer") 和一直到单个 xml.SelectNodes("/InvoicesDoc") 但仍然 XmlNodeList aNodes 将返回空。 第一次尝试我从文件中加载了 XML 文档并遇到了问题。然后我认为文件可能有问题所以直接从站点更改文件的负载提供了我需要处理的这个 xml 模板。这两个选项都会很好地加载文件,因为我可以在保存时看到它,但是我的更改不会完成,因为 aNodes 是空的并且 foreach 循环将立即跳过。

我做错了什么?

提前感谢您的帮助。

ps 这是我需要编辑的 xml https://www.aade.gr/sites/default/files/2020-09/SampleXML_1.1%20%20%28%CE%A4%CE%99%CE%9C-%CE%A0%CE%A9%CE%9B%CE%97%CE%A3%CE%97%CE%A3_%CE%91%CE%A5%CE%A4%CE%9F%CE%A4%CE%99%CE%9C%29%20.xml

更新:我刚刚尝试使用另一个 xlm 在 microsoft 示例中找到,名为 books on https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms762271(v=vs.85) 当我查找 /catalog/book 时,XmlNodelist 也将返回 null/empty。所以好的一面是我需要编辑的原始 xml 文件没有问题,坏的一面是我仍然无法弄清楚我做错了什么。

【问题讨论】:

你试过aNode.Attributes[“vatNumber”].Value = “123456789”; foreach 循环将立即跳过并且不会继续执行其代码,因为 aNodes 为空。这是我的问题。 **XmlAttribute vatAttribute=aNode.Attributes["vatNumber"]; vatAttribute.Value = "123456789"; ** 根本不会执行,因为 foreach 循环在第一次迭代中跳过,因为 aNodes 是空的,没有什么可以迭代。 你能不能只在这个问题中以正确的格式添加xml <InvoicesDoc xmlns="http://www.aade.gr/myDATA/invoice/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:icls="https://www.aade.gr/myDATA/incomeClassificaton/v1.0" xmlns:ecls="https://www.aade.gr/myDATA/expensesClassificaton/v1.0" xsi:schemaLocation="http://www.aade.gr/myDATA/invoice/v1.0/InvoicesDoc-v0.6.xsd"> <invoice> <issuer> <vatNumber>999999999</vatNumber> <country>GR</country> <branch>1</branch> </issuer> <counterpart> <vatNumber>888888888</vatNumber> <country>GR</country> <branch>0</branch> <address> 希望这是一种正确的方法,但所有 xml 都不适合 【参考方案1】:

XmlNodeList aNodes 返回 null,因为 xml 包含这些命名空间声明:

<InvoicesDoc xmlns=\"http://www.aade.gr/myDATA/invoice/v1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" 
xsi:schemaLocation=\"http://www.aade.gr/myDATA/invoice/v1.0/InvoicesDoc-v0.6.xsd\" 
xmlns:icls=\"https://www.aade.gr/myDATA/incomeClassificaton/v1.0\" 
xmlns:ecls=\"https://www.aade.gr/myDATA/expensesClassificaton/v1.0\">

你需要像这样管理你的xml:

XmlDocument xml = new XmlDocument();
xml.Load(@"https://www.aade.gr/sites/default/files/2020-09/SampleXML_1.1%20%20%28%CE%A4%CE%99%CE%9C-%CE%A0%CE%A9%CE%9B%CE%97%CE%A3%CE%97%CE%A3_%CE%91%CE%A5%CE%A4%CE%9F%CE%A4%CE%99%CE%9C%29%20.xml");

XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable);
            manager.AddNamespace("InvoicesDoc", "http://www.aade.gr/myDATA/invoice/v1.0");

//Example to get the root element
XmlNodeList root = xml.SelectNodes("/InvoicesDoc:InvoicesDoc", manager);

//Example to get the VatNumber tag
XmlNodeList aNodes =xml.SelectNodes("/InvoicesDoc:InvoicesDoc/InvoicesDoc:invoice/InvoicesDoc:issuer/InvoicesDoc:vatNumber", manager);

【讨论】:

试过但同样的问题。谢谢你的帖子。好吧,我尝试使用 xdocument.loadxml,但在尝试使用根级别的消息数据加载 xml 时出现错误。第 1 行位置 1。这可能是问题吗?我不知道我还在研究,因为它可能是 xml 开头的一个特殊字符,根据我从 xlmLoad 得到的错误导致问题 嗯....正如我告诉你的,当我第一次尝试时它不起作用。当我试图找到解决方案时,我删除了我从磁盘加载的 xml 文件。然后我运行了我的代码只有 2 行。一个是从供应商网站加载 xml 文档,第二行是将 xml 文件保存在磁盘上。然后我从我刚刚使用我的代码保存的磁盘上的文件中更改了 xml 的负载。然后你的代码工作正常,aNodes 没有返回空!实际上它只加载了一个包含所有信息的节点。现在我正在辩论,去找一份牧羊人的工作还是继续努力把它做好?非常感谢您的帮助 2 小时仍在尝试获取其余节点,但没有运气。任何额外的帮助将不胜感激。 我已经修改了我的答案,添加了读取所需标签的方式,当您使用包含命名空间的 xml 文件时,您需要为 xpath 上的每个元素添加命名空间。 你是***的!谢谢...我会记住这一点以备将来使用,因为现在我发现了另一种解决方法,它可以与特定的 xml 文件一起正常工作,因为它没有很多重复的节点。所以我最终使用 doc.GetElementsBytagName 然后检查父节点并采取相应的行动。但是你教我如何编辑 xml 并非常感谢你。这是我现在的代码: XmlNodeList ele2 = doc.GetElementsByTagName("vatNumber"); foreach (XmlNode n in ele2) if (n.ParentNode.Name == "counterpart")

以上是关于在 C# 中使用 Xmldocument 修改 xml的主要内容,如果未能解决你的问题,请参考以下文章

如何在c#中关闭xmldocument

C#下使用XmlDocument详解

[C#]在 XMLDocument 中添加 XSL 引用

有效地使用 XmlDocument.Save()

如何在 c# .net CF 3.5 中使用 XmlDocument 向 xml 添加属性

在 C# 中过滤 XmlDocument xml 的最快方法