Вставка элемента в xml приводит к ненужным свойствам xmlns = - PullRequest
1 голос
/ 07 апреля 2009

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

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

Приветствие Джек.

Ответы [ 3 ]

1 голос
/ 14 мая 2009

Это не ответ на вопрос, но я все еще хотел, чтобы он сказал вам.

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

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

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

1 голос
/ 07 апреля 2009

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

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

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

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

до:

XElement newElement = new XElement(ns + "MyNewElement", "12345");
0 голосов
/ 26 апреля 2011

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

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

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

myXelement.SetAttributeValue("xmlns", Nothing)
...