Я экспериментирую с литералами xml в vb.net, но кое-что я не получаю.Вот небольшой пример, который иллюстрирует проблему.Я добавляю два узла PropertyGroup в пустой проект Visual Studio.Первый добавляется как xml литерал, второй как new XElement:
PropertyGroup
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.Почему это так, и можно ли этого избежать?
Похоже, что это нарочно, основываясь на чтении страницы MSDN для Оператор импорта (пространство имен XML) .
Самый простой способ избежать этого - использовать перечисление SaveOptions.OmitDuplicateNamespaces , которое доступно в .NET 4.0:
SaveOptions.OmitDuplicateNamespaces
vbproj.AddAnnotation(SaveOptions.OmitDuplicateNamespaces)
Если .NET 4.0 не вариант, вы можете очистить пространства имен, как показано в этих двух сообщениях в блоге:
XElement
True