gpt4 book ai didi

c# - 使用 XmlDocument 向元素添加命名空间的正确方法

转载 作者:太空宇宙 更新时间:2023-11-03 12:09:56 24 4
gpt4 key购买 nike

我必须修改传入的 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));
}

最佳答案

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

如果您能够使用 XDoxument 代替,这是可能的。参见 this回答解决方案。

关于c# - 使用 XmlDocument 向元素添加命名空间的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52873058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com