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

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

1回复

用带有XmlWriter命名空间的XmlWriter编写XElement吗?

我有一个XmlWriter,它已经具有设置了xmlns属性的根元素。 我现在有一个XElement(带有很多子元素),没有指定名称空间。 如果我只是这样做: 我以无效的xml结尾: 由于禁止指定空名称空间。 这是有问题的,因为我需要在XSD之后进行验证。 我可
6回复

XmlWriter编写空xmlns

我正在使用以下代码初始化XmlDocument 稍后在此过程中,我使用以下代码为其写入一些值 当我保存文档时,这最终会给我以下xml 如何摆脱Placemark元素上的空xmlns? - 重播如何改变以往的地板 - 如果我将命名空间放在地标的写入中,则将非元
1回复

追加到现有XML时的XMLWriter格式

我有一个现有的XML文件。 通过XmlWriter (或XmlTextWriter )将新内容添加到其中,因为它们都表现出相同的行为,所以没关系。 问题: 新内容未使用缩进格式。 XmlWriter示例输出,其中Indent=true且IndentChars设置为空格:
1回复

XmlWriter大型xml文件创建分为方法

我正在使用XmlWriter创建一个大型xml文件,并且我知道使用 被认为是生成大型文件的最快方法,但是我似乎找不到任何人在谈论(或在XmlWriter文档中)将其全部拆分为生成xml块的方法。 我的方法大约有150行,我想尽可能地保持模块化,因为要填充的所有数据大部分都会从表单中提取
4回复

使用XmlWriter迭代构建XML文件

我希望能够使用XmlWriter (C#,.NET)创建一个XML文档,其中多次调用生成XML的方法,然后调用最终方法来关闭所有内容。 当我尝试多次调用此方法时: ...它返回一个错误,说WriteStartDocument needs to be the first call 。
2回复

如何在另一个内部使用XmlWriter?

我正在尝试解决与如何使用WriteEndElement检查元素名称中描述的问题类似的问题 我使用内部和外部XmlWriter编写了此代码。 这个想法是,关闭内部XmlWriter还将关闭不完全可靠的第三方库留下的任何未完成的标签。 我希望这会产生 但是相反,我在应写<
1回复

如何在XmlWriter上指定自定义格式

执行序列化后,我的XML看起来像 我需要一种控制十进制数字格式的方法。 不幸的是,我没有找到解决方案。
1回复

在不调用XmlWriter.WriteStartDocument()的情况下使用XmlWriter.WriteEndDocument()是否可行

我想知道XmlWriter.WriteStartDocument()和XmlWriter.WriteEndDocument()背后的原因。 在我的场景中,我正在创建一个包含一些数据的XML文档,例如: 在序列化时,如果我们跳过对xmlWriter.WriteStartDocumen
1回复

保存XML时,XmlWriter会混淆格式

我正在尝试读取现有的XML文件,修改一堆节点的InnerText和Attribute值,然后将更改保存回文件。 我正在使用以下代码。 保存XML文件时,它会混乱格式化。 例如,某些节点之间的换行符消失。 如何保留(或重新格式化格式化和缩进)XML文件?
1回复

当xml:space = preserve时,XmlWriter插入空格

鉴于此代码(C#,.NET 3.5 SP1): 断言失败是因为XmlWriter在<item>元素周围插入换行符并缩进,这似乎与xml:space="preserve"属性相矛盾。 我试图获取没有空格的输入(或者只有很大的空白,并且已经加载到XmlDocument )并