Вставка элемента в xml создает ненужное свойство xmlns =

Каждый раз, когда я вставляю элемент в свой xml-документ, система добавляет к нему атрибут xmlns = "". Как мне от этого избавиться? Почему это там? Я использую очень простой linqtoxml.

У меня есть простой XML-файл (обратите внимание, что здесь нет строки объявления Xml, и она содержит пространство имен):

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <PropertyGroup>
  </PropertyGroup>
</Project>

Я делаю следующее:

        //  1. Read in the Xml file
        XDocument testXml = XDocument.Load(@"C:\test.xml");

        //  2. Add in the extra node
        XNamespace ns = testXml.Root.Attribute("xmlns").Value;          // Get the existing namespace
        XElement newElement = new XElement("MyNewElement", "12345");    // Create the new element
        testXml.Element( ns + "Project").Add( newElement );          // Insert the new element into the document

        //  3. Write To Disk (without the xml header line)
        TextWriter tw = File.CreateText(@"C:\test2.xml");
        tw.Write(testXml.ToString());
        tw.Close();

При просмотре файла я получаю:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <PropertyGroup></PropertyGroup>
  <MyNewElement xmlns="">12345</MyNewElement>
</Project>

Мне нужно избавиться от бита xmlns = "". Я считаю, что при добавлении нового элемента необходимо включить пространство имен, потому что исходный документ имеет пространство имен. Я попытался вставить элемент с помощью:

    testXml.Element( "Project").Add( newElement );

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

Я подумал о том, чтобы разобрать его второй раз и удалить все свойства xmlns = "", но, похоже, это не работает; Я продолжаю получать исключение с нулевой ссылкой. Вероятно, есть какое-то фундаментальное понимание пространств имен, которых мне здесь не хватает, но я огляделся и, похоже, не нашел никаких намеков.

Может ли кто-нибудь указать мне в правильном направлении?

Ура, Джек.


person Community    schedule 07.04.2009    source источник


Ответы (3)


XmlNs - это «XML NameSpace» - в основном идея такая же, как у пространств имен C ++, пакетов Java / C # и т. Д., За исключением того, что он предназначен для анализа с учетом различных XML-схемы (например, XSD, DTD).

Вы создаете MyNewElement без указания его пространства имен, поэтому ваше дерево DOM интерпретирует это как пустое пространство имен. Поскольку корень вашего документа определяет непустое пространство имен, объявление xmlns = "", которое он вставляет, является правильным в соответствии с вашим кодом. Вам необходимо указать пространство имен в MyNewElement, прежде чем каким-либо образом добавить его в документ. Я не знаком с LinQ XML API, но знаю, что в одной из более ранних версий синтаксических анализаторов .Net XML рекомендованной практикой было использование CreateElement() вызова из XmlDocument экземпляра для правильного подъема этих параметров.

Просто на основе безумного предположения, основанного на коде поиска для элемента Project, и вообще не зная LinQ, попробуйте изменить:

XElement newElement = new XElement("MyNewElement", "12345");

to:

XElement newElement = new XElement(ns + "MyNewElement", "12345");
person Not Sure    schedule 07.04.2009

Это не ответ на вопрос, но я все же хотел вам это сказать.

Вы можете сохранить x-документ в файл с помощью метода save:

XDocument testXml = XDocument.Load(@"C:\test.xml");
...
testXml.Save(@"c:\test.xml"); 

Нет необходимости использовать TextWriter.

person tuinstoel    schedule 14.05.2009

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

<serveur nom='nouveau serveur'  xmlns='urn:myLogConfig'>

а затем удалите его в коде: (vb)

myXelement.SetAttributeValue("xmlns", Nothing)
person adel    schedule 26.04.2011