如何避免 XmlWriter 创建默认的“xmlns”空属性?

Posted

技术标签:

【中文标题】如何避免 XmlWriter 创建默认的“xmlns”空属性?【英文标题】:How to avoid XmlWriter create a default "xmlns" empty attribute? 【发布时间】:2016-05-26 11:53:35 【问题描述】:

拥有这种节点(我们可以在 .vbproj 项目文件中找到):

...
<ItemGroup>
    <Import Include="Microsoft.VisualBasic"/>
    <Import Include="Microsoft.Win32"/>
    <Import Include="Microsoft.Win32.SafeHandles"/>
    ...
</ItemGroup>
...

我用 getter 和 setter 在我的类中声明了一个属性,以获取导入的集合,或者替换给定集合的整个节点内容。

好吧,我遇到的问题是,当我尝试替换节点内容时,我的 XmlWriter 实例添加了一个额外的空 xmlns 属性,请参阅这个结果示例:

...
<ItemGroup>
    <Import Include="Microsoft.VisualBasic" xmlns="" />
    <Import Include="Microsoft.Win32" xmlns="" />
    <Import Include="Microsoft.Win32.SafeHandles" xmlns="" />
    ...
</ItemGroup>
...

为什么会发生这种情况,以及如何避免?

我对字符串替换(仅在该节点上)等非高效解决方案持开放态度,但我尝试过但没有成功。

这是我正在使用的相关代码:

Public Property ImportedNamespaces As SortedSet(Of String)
    Get
        Return New SortedSet(Of String)((From el As XElement In Me.ItemGroups()(1).Elements()
                                         Select el.@Include))
    End Get
    Set(ByVal value As SortedSet(Of String))
        Me.ItemGroups()(1).RemoveAll()

        Dim writer As XmlWriter = Me.ItemGroups()(1).CreateWriter
        For Each s As String In value
            With writer
                .WriteStartElement(Nothing, "Import", Nothing)
                .WriteAttributeString(Nothing, "Include", Nothing, s)
                .WriteEndElement()
            End With
        Next
        writer.Flush()
        writer.Close()

        ' This doesn't works.
        ' For Each el As XElement In Me.ItemGroups()(1).Elements("Import")
        '     el.Attribute("xmlns").Remove()
        ' Next

    End Set
End Property

【问题讨论】:

你能告诉我们ItemGroups()(1) 是什么,那是什么样的对象,XElementXDocument @Martin Honnen 是的 ItemGroupsIEnumerable(Of XElement),然后索引器 (1) 返回 XElement。感谢您的评论!。 看我的回答,你基本上必须使用要插入新元素的父节点的命名空间,以避免任何xmlns="" undeclaration。 【参考方案1】:

假设您有一个XElement,那么您可以使用.WriteStartElement(Nothing, "Import", Me.ItemGroups()(1).Name.NamespaceName),或者您可能希望将整个 XmlWriter 使用替换为

Me.ItemGroups()(1).Add(From s As String In value Select New XElement(Me.ItemGroups()(1).Name.Namespace + "Import", New XAttribute("Include", s)))

【讨论】:

这不是我使用和建议使用的字符串连接运算符,它是+ msdn.microsoft.com/en-us/library/… 的重载,它允许您“添加”具有元素本地名称的字符串到XNamespace 以构造XName。您使用&amp; 进行的编辑会导致错误“BC30452 Operator '&' is not defined for types 'XNamespace' and 'String'.”。 对不起,我没有注意到不是“NamespaceName”字符串属性,完全是我的错,再次感谢!。

以上是关于如何避免 XmlWriter 创建默认的“xmlns”空属性?的主要内容,如果未能解决你的问题,请参考以下文章

使用XmlWriter写Xml

如何在 .NET 中使用 XmlWriter 创建 XmlDocument?

dom4j xmlwriter如何去掉头文件也就是版本信息

C# XMLWriter 创建 WriteAttributeStringAsync

如何将 EntityReference(例如 )写入 XmlNodeReader 读取的 XmlWriter?

可以使用 XmlWriter 将 XML 写入内存吗?