Мне нужно изменить входящее сообщение SOAP XML, чтобы добавить пространство имен к одному из элементов, чтобы десериализация работала.Однако, когда я добавляю атрибут xmlns к правильному элементу, я получаю сообщение об ошибке при попытке загрузить xml в XmlWriter через поток (что мне нужно сделать в моей реализации IClientMessageInspector, чтобы заменить ответ на сообщение).
The prefix '' cannot be redefined from '' to 'http://www.example.com' within the same start element tag.
У меня есть обходной путь, который заключается в том, что после того, как я изменил атрибут, я перезагружаю весь XML-документ из его собственного OuterXML.По какой-то причине это работает, но заставляет меня думать, что должен быть «правильный» способ сделать это.
Вот пример теста, который демонстрирует проблему и мои текущие решения:
[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));
}