Если узел принадлежит пространству имен, его дочерние элементы по умолчанию принадлежат тому же пространству имен. Поэтому нет необходимости указывать атрибут xmlns
для каждого дочернего элемента, что хорошо.
Тем не менее.
Если я создам два узла, как это:
Dim parent = <parent xmlns="http://my.namespace.org"/>
Dim child = <child xmlns="http://my.namespace.org">value</child>
parent.Add(child)
Console.WriteLine(parent.ToString)
Результат таков:
<parent xmlns="http://my.namespace.org">
<child xmlns="http://my.namespace.org">value</child>
</parent>
Но, если создать их менее удобным способом:
Dim parent = <parent xmlns="http://my.namespace.org"/>
Dim child As New XElement(XName.Get("child", "http://my.namespace.org")) With {.Value = "value"}
parent.Add(child)
Console.WriteLine(parent.ToString)
Результат более желателен:
<parent xmlns="http://my.namespace.org">
<child>value</child>
</parent>
Очевидно, я бы предпочел использовать первый способ, потому что он намного более интуитивно понятен и прост в коде. Есть и другая причина не использовать метод 2 - иногда мне нужно создавать узлы с XElement.Parse
, анализируя строку, содержащую атрибут xmlns
, который дает точно такие же результаты, что и метод 1.
Итак, вопрос в том, как получить красивый результат метода 2, создавая узлы, как в методе 1? Единственный вариант, который я вижу, - это создать метод, который клонировал бы данный XElement, эффективно воссоздав его в соответствии с шаблоном метода 2, но это кажется уродливым. Я ищу более очевидное решение, которое я почему-то упустил.