15

我在工作中广泛使用 .NET XML 技术。我非常喜欢的一件事是 XSLT 引擎,更准确地说是它的可扩展性。然而,有一小块一直是烦恼的根源。没什么大不了的,或者我们不能忍受的东西,但它阻止了我们生成我们想要生成的漂亮 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>

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

PS。作为额外的奖励,我想覆盖默认命名空间,在编写节点时更改它。

4

3 回答 3

15

使用此代码:

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();
}

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

<?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>
于 2011-06-26T07:36:40.017 回答
2

你试过这个吗?

Dim settings = New XmlWriterSettings With {.Indent = True,
                                          .NamespaceHandling = NamespaceHandling.OmitDuplicates,
                                          .OmitXmlDeclaration = True}
Dim s As New MemoryStream
Using writer = XmlWriter.Create(s, settings)
    ...
End Using

有趣的是'NamespaceHandling.OmitDuplicates'

于 2011-06-27T13:38:46.520 回答
1

我不确定这是您要查找的内容,但您可以在开始写入 Xml 流时使用这种代码:

myWriter.WriteAttributeString("xmlns", "abx", null, "http://bladibla");

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

于 2011-06-21T07:27:44.670 回答