Вставка строки XML в существующий документ с помощью C# ломает всеC#

Место общения программистов C#
Anonymous
Вставка строки XML в существующий документ с помощью C# ломает все

Сообщение Anonymous »

Я использую C# с классами System.Xml для управления существующим XML-документом.
В частности, мне нужно вставить фрагменты XML, которые у меня есть в строковая форма внутри определенных узлов документа.
Для этого я создаю новый элемент, а затем устанавливаю свою XML-строку в его свойстве InnerXml, например:

Код: Выделить всё

using System.Xml;

string nsUri = "http://myorg/myns";
string baseDocument = @$"";

XmlDocument doc = new XmlDocument();
doc.LoadXml(baseDocument);
var nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("default", nsUri);

var target = doc.CreateElement("Target", nsUri);
target.InnerXml= @"
This is a subnode
Here is another subnode
";
doc.DocumentElement.AppendChild(target);

doc.Save(@"C:\text.xml");
Глядя на вывод, вот результат:

Код: Выделить всё



This is a subnode
Here is another subnode


Как видите, существует проблема: каждому подузлу внутри вставленной мной строки XML присваивается пустой атрибут xmlns: xmlns="".
Это само по себе уже проблема, но гораздо хуже то, что после этого документ оказывается в противоречивом состоянии, и дальнейшие манипуляции приводят к странным результатам. Например, если после этого я сделаю:

Код: Выделить всё

var sub1 = target.SelectSingleNode("default:Sub1", nsm);
тогда sub1 имеет значение null.
Итак, очевидно, это неправильный способ сделать это, и проблема возникает, когда я переназначаю InnerXml. Можете ли вы рассказать мне, как правильно это сделать?
Некоторые примечания:
  • Я знаю, что могу создавать элементы и атрибуты один за другим вместо того, чтобы просто выгружать строку XML внутри InnerXml, но фрагменты XML, которые мне нужно вставить, очень длинные, и было бы абсурдно вручную воссоздавать их в коде.
  • Я попробовал сделать это с помощью XmlDocumentFragment, но результат тот же


Подробнее здесь: https://stackoverflow.com/questions/784 ... everything

Вернуться в «C#»