пространство имен 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. Почему это так и можно ли этого избежать?


person jeroenh    schedule 28.04.2011    source источник


Ответы (1)


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

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

vbproj.AddAnnotation(SaveOptions.OmitDuplicateNamespaces)

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

person Ahmad Mageed    schedule 28.04.2011
comment
Здорово! Я использую .Net 4, поэтому у меня это отлично работает! Спасибо. Я не знал об этих SaveOptions .. Не очень-то заметно :-( - person jeroenh; 28.04.2011