Пространство имен xml и литералы xml

Я экспериментирую с xml-литералами в vb.net и что-то не получаю. Вот небольшой пример, который иллюстрирует проблему. Я добавляю два 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. Почему это так и можно ли этого избежать?

1 ответ

Решение

Похоже, это сделано специально для чтения страницы MSDN для оператора импорта (пространство имен XML).

Самый простой способ избежать этого - использовать SaveOptions.OmitDuplicateNamespaces перечисление, которое доступно в.NET 4.0:

vbproj.AddAnnotation(SaveOptions.OmitDuplicateNamespaces)

Если.NET 4.0 не подходит, вы можете очистить пространства имен, как показано в этих двух сообщениях в блоге:

Другие вопросы по тегам