首页 > 解决方案 > 在 C# 中使用 Xmldocument 修改 xml

问题描述

我正在尝试按照此处如何在 C# 中使用 XmlDocument 和 XmlNode 修改现有 XML 文件的另一篇文章中的说明编辑 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

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

标签: c#xmlxmldocumentxmlnode

解决方案


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);

推荐阅读