Как заставить XmlWriter правильно обрабатывать пространства имен?

Я хочу использовать 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 не пропускает повторяющиеся пространства имен, как я спросил?

7
задан SteveC 22 November 2012 в 12:00
поделиться