【发布时间】: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)是什么,那是什么样的对象,XElement或XDocument? -
@Martin Honnen 是的
ItemGroups是IEnumerable(Of XElement),然后索引器 (1) 返回XElement。感谢您的评论!。 -
看我的回答,你基本上必须使用要插入新元素的父节点的命名空间,以避免任何
xmlns=""undeclaration。
标签: .net xml vb.net xmlwriter xmlnode