Пространство имен 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 не подходит, вы можете очистить пространства имен, как показано в этих двух сообщениях в блоге:
- Очистка ваших пространств имен XML-литералов - предоставляет метод расширения для каждого
XElement
удалить пространство имен. - Подробнее о пространствах имен XML в VB.... - предоставляет метод расширения, который можно использовать на корневом узле и удалять пространства имен из дочерних элементов, указав
True
для второго параметра.