gpt4 book ai didi

c# - .NET XmlWriter 中的正确命名空间管理

转载 作者:可可西里 更新时间:2023-11-01 07:46:03 31 4
gpt4 key购买 nike

我在工作中广泛使用 .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 对其命名空间定义高效,有没有人有建议?

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

最佳答案

使用这段代码:

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>

关于c# - .NET XmlWriter 中的正确命名空间管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26743/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com