拥有这种节点(我们可以在 .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
答案 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)))
,或者您可能希望用
TasksFactory