Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建不带命名空间声明的XML元素_C#_Xml - Fatal编程技术网

C# 创建不带命名空间声明的XML元素

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

我正在尝试向以下XML文件添加一个新的“PropertyGroup”元素

<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>