每当我将一个元素插入到我的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 =“”属性,但它似乎不起作用;我一直得到空引用异常。可能对这里缺少的命名空间有一些基本的了解,但我环顾四周,似乎无法找到任何提示。
有人能指出我正确的方向吗?
干杯 插孔。
答案 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)