.NET XmlWriter中正确的名称空间管理

Boa*_*oaz 15 .net c# xml xmlwriter

我在工作中使用.NET XML技术.我非常喜欢的一件事是XSLT引擎,更确切地说是它的可扩展性.然而,有一件小东西一直是烦恼的源头.没有任何重大或我们无法忍受的东西,但它阻止我们生成我们想要生成的漂亮的XML.

我们做的一件事是将节点内联转换并将节点从一个XML文档导入另一个XML文档.

遗憾的是,当您将节点保存到XmlTextWriter(实际上无论何种XmlWriter.Create(Stream) 返回)时,命名空间定义都会被抛出,无论是否有必要(先前已定义).你会得到以下xml:

<root xmlns:abx="http://bladibla">  
     <abx:child id="A">  
         <grandchild id="B">
             <abx:grandgrandchild xmlns:abx="http://bladibla" />  
         </grandchild>  
     </abx:child>  
</root>
Run Code Online (Sandbox Code Playgroud)

有没有人建议如何说服.NET对其命名空间定义有效?

PS.作为一个额外的好处,我想覆盖默认命名空间,在编写节点时更改它.

Kir*_*huk 14

使用此代码:

using (var writer = XmlWriter.Create("file.xml"))
{
    const string Ns = "http://bladibla";
    const string Prefix = "abx";

    writer.WriteStartDocument();

    writer.WriteStartElement("root");

    // set root namespace
    writer.WriteAttributeString("xmlns", Prefix, null, Ns);

    writer.WriteStartElement(Prefix, "child", Ns);
    writer.WriteAttributeString("id", "A");

    writer.WriteStartElement("grandchild");
    writer.WriteAttributeString("id", "B");

    writer.WriteElementString(Prefix, "grandgrandchild", Ns, null);

    // grandchild
    writer.WriteEndElement();
    // child
    writer.WriteEndElement();
    // root
    writer.WriteEndElement();

    writer.WriteEndDocument();
}
Run Code Online (Sandbox Code Playgroud)

此代码生成了所需的输出:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:abx="http://bladibla">
  <abx:child id="A">
    <grandchild id="B">
      <abx:grandgrandchild />
    </grandchild>
  </abx:child>
</root>
Run Code Online (Sandbox Code Playgroud)

  • @polish:赔率?你什么意思?重点是人们复制/粘贴我们的示例,没有人应该使用.NET 2.0中的"新XmlTextWriter". (4认同)
  • @KirillPolishchuk当我使用`writer.WriteAttributeString("xmlns",Prefix,null,Ns);`我得到错误:`'xmlns'属性绑定到保留命名空间'http://www.w3.org/2000/xmlns /`任何想法?使用PowerShell (2认同)

Sim*_*ier 1

我不确定这就是您正在寻找的内容,但是当您开始写入 Xml 流时,您可以使用此类代码:

myWriter.WriteAttributeString("xmlns", "abx", null, "http://bladibla");
Run Code Online (Sandbox Code Playgroud)

XmlWriter 应该记住它并且不再重写它。它可能不是 100% 防弹,但在大多数情况下都有效。