пространство имен xml и XML-литералы

#vb.net #xml-literals

#vb.net #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 для инструкции Imports (пространство имен XML).

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

 vbproj.AddAnnotation(SaveOptions.OmitDuplicateNamespaces)
  

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

Комментарии:

1. Отлично! Я использую .Net 4, так что у меня это работает идеально! Спасибо. Я не знал об этих вариантах сохранения.. Не очень доступно для обнаружения 🙁