我在工作中使用.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>

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

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

===============>>#1 票数: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();
}

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

<?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>

===============>>#2 票数:1

我不确定这是你在找什么,但是当你开始写Xml流时,你可以使用这种代码:

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

XmlWriter应该记住它,不再重写它。 它可能不是100%防弹,但它大部分时间都有效。

===============>>#3 票数:1

你试过这个吗?

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'

  ask by Boaz translate from so

未解决问题?本站智能推荐: