如何避免 XmlWriter 创建一个默认的 "xmlns" 空属性?

How to avoid XmlWriter create a default "xmlns" empty attribute?

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

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

我在 class 中用 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

假设你有一个 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)))