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

时间:2016-05-26 11:53:35

标签: .net xml vb.net xmlwriter xmlnode

拥有这种节点(我们可以在 .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

1 个答案:

答案 0 :(得分:1)

假设您有一个.WriteStartElement(Nothing, "Import", Me.ItemGroups()(1).Name.NamespaceName),那么您可以使用Me.ItemGroups()(1).Add(From s As String In value Select New XElement(Me.ItemGroups()(1).Name.Namespace + "Import", New XAttribute("Include", s))) ,或者您可能希望用

替换整个XmlWriter使用
TasksFactory