#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 не подходит, вы могли бы рассмотреть возможность очистки пространств имен, как показано в этих двух сообщениях в блоге:
- Очистка ваших пространств имен XML-литералов — предоставляет метод расширения, который будет использоваться в каждом из них
XElement
для удаления пространства имен. - Подробнее о пространствах имен XML в VB …. — предоставляет метод расширения, который можно использовать на корневом узле и удалять пространства имен из дочерних элементов, указав
True
для второго параметра.
Комментарии:
1. Отлично! Я использую .Net 4, так что у меня это работает идеально! Спасибо. Я не знал об этих вариантах сохранения.. Не очень доступно для обнаружения 🙁