我正在 vb.net 中尝试使用 xml 文字,但有些东西我不明白。这是一个说明问题的小示例。我将两个 PropertyGroup 节点添加到一个空的 Visual Studio 项目中。第一个添加为 xml 文字,第二个添加为 new XElement :

Imports <xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Module MyModule
Sub Main()
    Dim vbproj = <?xml version="1.0" encoding="utf-8"?>
                <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
                </Project>

    vbproj.Root.Add(<PropertyGroup></PropertyGroup>)
    Dim xNameSpace As XNamespace = "http://schemas.microsoft.com/developer/msbuild/2003"
    vbproj.Root.Add(New XElement(xNameSpace + "PropertyGroup"))

    Console.WriteLine(vbproj)
End Module

此代码写入以下输出:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup xmlns="http://schemas.microsoft.com/developer/msbuild/2003"></PropertyGroup>
  <PropertyGroup />
</Project>

如您所见,第一个 PropertyGroup 节点包含一个冗余的 xmlns 声明。为什么会这样,可以避免吗?

最佳答案

这似乎是设计使然,基于阅读 Imports Statement (XML Namespace) 的 MSDN 页面。

避免它的最简单方法是使用 SaveOptions.OmitDuplicateNamespaces enumeration ,它在 .NET 4.0 中可用:

vbproj.AddAnnotation(SaveOptions.OmitDuplicateNamespaces)

如果 .NET 4.0 不是一个选项,那么您可以考虑清理命名空间,如以下两篇博文所示:
  • Cleaning up your XML literal namespaces - 提供一个扩展方法,用于每个 XElement 以删除命名空间。
  • More on XML Namespaces in VB.... - 提供了一个扩展方法,可以在根节点上使用,并通过为第二个参数指定 True 从子项中删除命名空间。
  • 关于vb.net - xml 命名空间和 xml 文字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5819643/

    10-11 21:59
    查看更多