C# 创建不带命名空间声明的XML元素
我正在尝试向以下XML文件添加一个新的“PropertyGroup”元素C# 创建不带命名空间声明的XML元素,c#,xml,C#,Xml,我正在尝试向以下XML文件添加一个新的“PropertyGroup”元素 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> <PropertyGroup> <ProjectGuid>{00AA7ECA-95A0-0000-0000-AD4D2E056BFE}</Proje
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<ProjectGuid>{00AA7ECA-95A0-0000-0000-AD4D2E056BFE}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>testnS</RootNamespace>
<AssemblyName>testname</AssemblyName>
<PluginId>4B84E5C0-EC2B-4C0C-8B8E-3FAEB09F74C6</PluginId>
</PropertyGroup>
</Project>
{00AA7ECA-95A0-0000-0000-AD4D2E056BFE}
图书馆
性质
testnS
测试名
4B84E5C0-EC2B-4C0C-8B8E-3FAEB09F74C6
我使用的代码如下(注意,还有其他逻辑被删除):
XmlTextReader=新的XmlTextReader(文件名);
XmlDocument doc=新的XmlDocument();
文件加载(读卡器);
reader.Close();
XmlNamespaceManager ns=新的XmlNamespaceManager(doc.NameTable);
ns.AddNamespace(“x”http://schemas.microsoft.com/developer/msbuild/2003");
XmlElement根=doc.DocumentElement;
XmlNode refNode=root.SelectSingleNode(“x:Project”,ns);
root.SelectSingleNode(“项目”,ns);
XmlElement newElement=doc.CreateElement(“PropertyGroup”http://schemas.microsoft.com/developer/msbuild/2003");
newElement.InnerXml=“测试”;
root.InsertAfter(新元素,refNode);
文件保存(文件名);
这将在XML文档中产生以下新元素:
<PropertyGroup>
<value xmlns="">test</value>
</PropertyGroup>
测试
如何删除元素上的名称空间声明?您需要为添加到DOM中的所有元素指定XML名称空间:
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/2003");
XmlElement root = doc.DocumentElement;
XmlNode refNode = root.SelectSingleNode("x:Project", ns);
XmlElement newElement = doc.CreateElement(
"PropertyGroup",
"http://schemas.microsoft.com/developer/msbuild/2003");
var value = newElement.AppendChild(doc.CreateElement(
"value",
"http://schemas.microsoft.com/developer/msbuild/2003"));
value.AppendChild(doc.CreateTextNode("test"));
root.InsertAfter(newElement, refNode);
如果您没有对任何元素执行此操作(或者如果您使用
InnerXml
这样),则该元素将获得可怕的空名称空间。发生这种情况的原因是,您通过在根节点上定义名称空间定义,将文档的默认名称空间定义为“”:
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
然后继续向文档中添加一个不在任何名称空间(“null”名称空间)中的元素。这必须符合以下条件:
xmlns=""
因为如果不是,则意味着新元素位于前面提到的Microsoft名称空间中,而它不是(或者更确切地说,它不是您要求的名称空间)
因此,要么:
- 实际上,您希望新元素 位于Microsoft命名空间中-位于 在这种情况下,你需要这样说。这个 最简单的方法是使用createElement 并提供名称空间,尽管 您可能可以明确地声明它 在您的 InnerXml(这不是一个特殊的 添加节点的好方法)
- 你真的想加入这个元素吗 空名称空间,在这种情况下 可能比排位赛都好 不在中的其他节点 具有命名空间的空命名空间 前缀
可以找到名称空间的快速概述。为了避免在新创建的元素中出现额外的
xmlns=“”
属性,可以将根名称空间作为参数传递:
$child = $doc.CreateElement("value", $doc.DocumentElement.NamespaceURI);
$res = $doc.PropertyGroup.AppendChild($child); # res here to avoid extra output
这将导致
<PropertyGroup>
<value></value>
</PropertyGroup>
您必须在此处使用InnerXml属性吗?明确地做到这一点会更容易。(如果可以的话,使用LINQ到XML会更容易。)在LINQ到XML上不确定-LINQ对我来说是未知的…:-)但我刚刚发现:CreateElement调用中的名称空间是绝对必要的吗?
<PropertyGroup>
<value></value>
</PropertyGroup>