Правильный способ добавить пространство имен к элементу, используя XmlDocument - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно изменить входящее сообщение 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));
    }

1 Ответ

0 голосов
/ 18 октября 2018

Согласно это вы не можете изменить пространство имен элементов в XmlDocument.Это также то, что @LocEngineer нашел в своем комментарии.В упомянутой статье упоминается, что единственный способ сделать это - сохранить и перезагрузить XmlDocument, что в точности и делает.

Если вы можете использовать вместо него XDoxument, этовозможный.См. этот ответ для решения.

...