les*_*ode 7 xml xmlwriter .net-4.0 xml-namespaces
我想使用XmlWriter写这样的东西(所有在一个命名空间中):
<Root xmlns="http://tempuri.org/nsA">
<Child attr="val" />
</Root>
Run Code Online (Sandbox Code Playgroud)
但我能得到的最接近的是:
<p:Root xmlns:p="http://tempuri.org/nsA">
<p:Child p:attr="val" />
</p:Root>
Run Code Online (Sandbox Code Playgroud)
使用此代码:
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我没有指定前缀时,我得到:
<Root xmlns="http://tempuri.org/nsA">
<Child p2:attr="val" xmlns:p2="http://tempuri.org/nsA" />
</Root>
Run Code Online (Sandbox Code Playgroud)
重复命名空间中这些"幻像"前缀的生成发生在整个生成的文档中(p3,p4,p5等).
当我不写属性时,我得到了我想要的输出(显然除了它缺少属性).
为什么XmlWriter不像我问的那样省略重复的命名空间?
尝试这样:
using System;
using System.Text;
using System.Xml;
class Program
{
private const string ns = "http://tempuri.org/nsA";
static void Main()
{
var settings = new XmlWriterSettings
{
Indent = true
};
using (var writer = XmlWriter.Create(Console.Out, settings))
{
writer.WriteStartElement("Root", ns);
writer.WriteStartElement("Child");
writer.WriteAttributeString("attr", "", "val");
writer.WriteEndElement();
writer.WriteEndElement();
}
}
}
Run Code Online (Sandbox Code Playgroud)