2013-07-18 2 views
2

У меня есть существующий документ xml.Как добавить атрибут xmlns в существующий документ xml

например

<Test> 
    <A /> 
</Test> 

я загрузить этот XML в XDocument. Мне нужно добавить атрибут xmlns в этот документ и сохранить его с помощью этого атрибута.

var xml = new XDocument.Load("c:\\filePath.xml"); 

Когда я пытаюсь это:

xml.Root.SetAttributeValue("xmlns", "http://namespaceuri"); 

я получаю исключение:

System.Xml.XmlException: The prefix '' cannot be redefined from 'http://namespaceuri' to within the same start element tag. 

благодаря

+1

Что вы пытаетесь достичь? Вы пытаетесь изменить пространство имен элементов 'Test' и' A'? –

+0

Нет, я просто хочу добавить атрибут xmlns в корневой элемент. ответ от Джона решил мою проблему. – zosim

+0

Ответ от Джона изменил пространство имен элементов –

ответ

7

Вы должны установить имена, чтобы быть в пространстве имен а также:

XNamespace ns = "http://namespaceuri"; 
foreach (var element in xml.Descendants().ToList()) 
{ 
    element.Name = ns + element.Name.LocalName; 
} 
xml.Root.SetAttributeValue("xmlns", ns.ToString()); 

В основном вы пытаетесь переместить все элементы в это пространство имен и сделать это пространство имен по умолчанию для корневого элемента. Вы не можете изменить пространство имен по умолчанию, оставив сам элемент в другом, но неквалифицированном пространстве имен.

Используя код выше с образцом XML (фиксированный, чтобы закрыть A) заканчивается:

<Test xmlns="http://namespaceuri"> 
    <A /> 
</Test> 

Обратите внимание, что этот код будет изменить пространство имен всех элементов. Если вы хотите быть более избирательным, вы должны добавить вызов Where после вызова xml.Descendants(), например.

foreach (var element in xml.Descendants() 
          .Where(x => x.Name.Namespace == XNamespace.None) 
          .ToList()) 
+0

@JeffMercado: Возможно. Я добавлю примечание, чтобы спросить ... –

Смежные вопросы