将元素插入xml会产生不必要的属性xmlns =

时间:2009-04-07 01:17:52

标签: xml properties namespaces linq-to-xml xml-namespaces

每当我将一个元素插入到我的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 );

但它一直给我一个null引用异常,我假设它是因为该元素需要命名空间名称。

我想过第二次解析并删除所有xmlns =“”属性,但它似乎不起作用;我一直得到空引用异常。可能对这里缺少的命名空间有一些基本的了解,但我环顾四周,似乎无法找到任何提示。

有人能指出我正确的方向吗?

干杯 插孔。

3 个答案:

答案 0 :(得分:1)

XmlNs是“XML NameSpace” - 基本上这个想法与C ++命名空间,Java / C#包等相同,除了它用于解析变化的XML Schemas(例如XSD,DTD)。

您正在创建MyNewElement而未指定其名称空间,因此您的DOM树将其解释为空名称空间。由于您的文档根指定了非空命名空间,因此根据您的代码,它插入的xmlns =“”声明是正确的。在以某种方式将其添加到文档之前,您需要在MyNewElement上指定命名空间。我不熟悉LinQ XML API,但我知道在早期版本的.Net XML解析器中,建议的做法是使用来自CreateElement()实例的XmlDocument调用来正确提升那些设置。

根据Project元素的查找代码进行疯狂猜测,根本不知道LinQ,请尝试更改:

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

为:

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

答案 1 :(得分:1)

这不是问题的答案,但我还是希望它告诉你。

您可以使用save方法将xdocument保存到文件中:

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

无需使用TextWriter。

答案 2 :(得分:0)

你必须把你的命名空间置于xml字符串中,如:

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

然后在代码中删除它:(vb)

myXelement.SetAttributeValue("xmlns", Nothing)