Я хочу использовать XmlWriter, чтобы написать что-то вроде этого (все в одном пространстве имен):
<Root xmlns="http://tempuri.org/nsA">
<Child attr="val" />
</Root>
, но самое близкое, что я могу получить, это:
<p:Root xmlns:p="http://tempuri.org/nsA">
<p:Child p:attr="val" />
</p:Root>
, используяэтот код:
using System;
using System.Text;
using System.Xml;
namespace ConsoleApplication1
{
internal class Program
{
private const string ns = "http://tempuri.org/nsA";
private const string pre = "p";
private static void Main(string[] args)
{
var sb = new StringBuilder();
var settings = new XmlWriterSettings
{
NamespaceHandling = NamespaceHandling.OmitDuplicates,
/* ineffective */
Indent = true
};
using (XmlWriter writer = XmlWriter.Create(sb, settings))
{
writer.WriteStartElement(pre, "Root", ns);
writer.WriteStartElement(pre, "Child", ns);
writer.WriteAttributeString(pre, "attr", ns, "val");
// breaks namespaces
writer.WriteEndElement();
writer.WriteEndElement();
}
Console.WriteLine(sb.ToString());
}
}
}
Когда я не указываю префикс, я получаю:
<Root xmlns="http://tempuri.org/nsA">
<Child p2:attr="val" xmlns:p2="http://tempuri.org/nsA" />
</Root>
Генерация этих «фантомных» префиксов в повторяющихся пространствах имен происходит по всему сгенерированному документу (p3, p4, p5 и т. д.).
Когда я не пишу атрибуты, я получаю желаемый вывод (за исключением отсутствия атрибутов, очевидно).
Почему не XmlWriter
пропуская повторяющиеся пространства имен, как я и просил?