пространство имен xml и литералы xml - PullRequest
3 голосов
/ 28 апреля 2011

Я экспериментирую с литералами 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 Ответ

4 голосов
/ 28 апреля 2011

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

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

vbproj.AddAnnotation(SaveOptions.OmitDuplicateNamespaces)

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

...