如何避免 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)
是什么,那是什么样的对象,XElement
或XDocument
?
@Martin Honnen 是的 ItemGroups
是 IEnumerable(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
。您使用&
进行的编辑会导致错误“BC30452 Operator '&' is not defined for types 'XNamespace' and 'String'.”。
对不起,我没有注意到不是“NamespaceName”字符串属性,完全是我的错,再次感谢!。以上是关于如何避免 XmlWriter 创建默认的“xmlns”空属性?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 .NET 中使用 XmlWriter 创建 XmlDocument?
C# XMLWriter 创建 WriteAttributeStringAsync