Добавить псевдоним / префикс в существующее пространство имен XML - PullRequest
0 голосов
/ 22 мая 2018

Как я могу преобразовать следующий XML

<root xmlns:xyz="do/not/change" xmlns="add/alias">
   <name>Test</name>
   <xyz:id>100<xyz:id>
</root>

в

<abc:root xmlns:xyz="do/not/change" xmlns:abc="add/alias">
   <abc:name>Test</abc:name>
   <xyz:id>100<xyz:id>
</abc:root>

Использование XDocument в C #

По сути, я хочу добавить псевдоним ко второмупространства имен и добавьте префикс ко всем элементам, которые еще не имеют префикса.

Вся информация, которую я могу найти, - это как удалить или добавить пространство имен, но ничего о том, как добавить префикс / псевдоним.

1 Ответ

0 голосов
/ 22 мая 2018

Это должно быть что-то вроде:

var xml = @"<root xmlns:xyz='do/not/change' xmlns='add/alias'>
   <name>Test</name>
   <xyz:id>100</xyz:id>
</root>";

var xdoc = XDocument.Parse(xml);

var xn = xdoc.Root.GetDefaultNamespace();
xdoc.Root.SetAttributeValue(XNamespace.Xmlns + "abc", xn.NamespaceName);
xdoc.Root.Attribute("xmlns").Remove();

foreach (var el in xdoc.Root.DescendantsAndSelf())
{
    if (el.Name.Namespace == xn)
    {
        el.Name = xn + el.Name.LocalName;
    }
}

Обратите внимание, что этот код сломается, если не определено пространство имен по умолчанию.

Вы можете добавить проверку как:

if (xn.NamespaceName == string.Empty) ...

Примечание 2: технически четные атрибуты могут иметь пространства имен, например xyz:myattr="Hello".Мы пропускаем это.

...