使用XmlDocument向元素添加名称空间的正确方法

逻辑人

我必须修改传入的SOAP XML消息,以向其中一个元素添加名称空间,以便反序列化能够正常工作。但是,当我将xmlns属性添加到正确的元素时,尝试通过流将xml加载到XmlWriter中时会出现错误(我需要在IClientMessageInspector实现中执行此操作以替换消息回复)。

The prefix '' cannot be redefined from '' to 'http://www.example.com' within the same start element tag.

我有一个解决方法,就是修改属性后,从其自己的OuterXML重新加载整个XML文档。出于某种原因,这是可行的,但让我认为必须有一种“正确”的方式来做到这一点。

这是一个示例测试,演示了该问题和我当前的解决方案:

    [Test]    
    public void XmlNamespaceTest()
    {
        var originalXmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><TestElement><Child>thing</Child></TestElement>";
        var desiredXmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><TestElement xmlns=\"http://www.example.com\"><Child>thing</Child></TestElement>";

        var doc = new XmlDocument();
        doc.LoadXml(originalXmlString);
        Assert.That(originalXmlString, Is.EqualTo(doc.OuterXml));

        // Write this document via an XMLWriter
        var ms = new MemoryStream();
        var xmlWriter = XmlWriter.Create(ms);
        doc.WriteTo(xmlWriter);
        xmlWriter.Flush();

        ms.Position = 0;
        StreamReader sr = new StreamReader(ms);
        var originalXmlViaXmlWriter = sr.ReadToEnd();

        Assert.That(originalXmlString, Is.EqualTo(originalXmlViaXmlWriter));

        // Add the namespace to the element
        ((XmlElement)doc.GetElementsByTagName("TestElement").Item(0))?.SetAttribute("xmlns", "http://www.example.com");
        Assert.That(desiredXmlString, Is.EqualTo(doc.OuterXml));


        // Now attempt to write this modified xml via an XMLWriter
        ms.SetLength(0);
        xmlWriter = XmlWriter.Create(ms);

        //Uncomment line below to fix the error.
        //doc.LoadXml(doc.OuterXml);

        doc.WriteTo(xmlWriter);
        xmlWriter.Flush();

        ms.Position = 0;
        sr = new StreamReader(ms);
        var modifedXmlViaXmlWriter = sr.ReadToEnd();
        Assert.That(desiredXmlString, Is.EqualTo(modifedXmlViaXmlWriter));
    }
欣塔姆

根据这个你不能改变在一个元素的命名空间XmlDocument这也是@LocEngineer在他的评论中找到的。被引用的文章提到,唯一的方法是保存并重新加载XmlDocument,这正是您正在执行的操作。

如果您可以XDoxument代替使用,则可以。请参阅答案以获取解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

xsl使用名称空间添加新元素

重写XMLDocument以使用名称空间前缀

向 HTML 表格添加空间的正确方法是什么?

如何使用 XSLT 向 XML 负载添加不同的名称空间

使用asinfo向名称空间添加额外的设备

如何使用linq xml向XML添加名称空间

没有获得正确的方法,使用jQuery向li添加li元素

如何防止XmlDocument.Save编写新元素的名称空间?

如何正确将XML命名空间添加到XMLDocument?

向XmlRoot属性添加名称空间前缀

通过boost向XML添加名称空间

使用 BEM 方法添加相同的元素名称

使用SOAP :: Lite在“方法”元素中定义名称空间

在XMLDocument中使用命名空间创建XML元素

使用jQuery向主体添加onload函数的正确方法

使用XMLDocument类向HTML文档添加元和样式

如何使用XMLService向元素添加两个命名空间?

如何正确使用“使用名称空间foo”?

当xml具有与元素关联的名称空间时,如何使用xslt从xml正确获取数据

XSLT-向某些子级添加名称空间声明

T-SQL:向XML添加名称空间

如何在C#中向XPath添加名称空间?

向XML文件添加其他名称空间

我如何使用xslt将变量名称空间添加到元素

如何从节点模块向全局名称空间添加打字稿名称空间?

从外壳程序向XML文档的默认名称空间的标签添加名称空间前缀。

使用 .NET API 以正确的方式将元素添加到模型空间

如果属性值小于3,如何使用jQuery向同级元素添加类名称3>

如何使用ExecutorService在多个线程中正确向ConcurrentHashMap中添加元素