c# - 如何制作 XML 节点的副本及其所有子节点和值但名称不同 C# .NET

标签 c# .net xml copy xmlnode

我试图复制一个 XML 节点及其所有子节点,但 XML 父节点名称不同,但抛出了一个错误,这是 xml 文件:

<Servers>
  <MyServer>
    <Host>0.0.0.0</Host>
     <Port>12</Port>
     <User>USER</User>
  </MyServer>
</Servers>

我正在尝试做的是 MyServer 的副本及其所有子节点和值但名称不同......像这样

<Servers>
  <MyServer>
    <Host>0.0.0.0</Host>
     <Port>12</Port>
     <User>USER</User>
  </MyServer>
  <MyCopyofMyServer>
    <Host>0.0.0.0</Host>
     <Port>12</Port>
     <User>USER</User>
  </MyCopyofMyServer>
</Servers>

我所做的是这样的:

 public void CopyInterface(string NewServer, string ServerToCopy)
 {
    xmldoc.Load(XMLInterfacesFile);
    XmlNode NodeToCopy = xmldoc.SelectSingleNode("Servers/" + ServerToCopy);
    XmlNode deep = NodeToCopy.CloneNode(true);    
    deep.InnerXml = deep.InnerXml.Replace(ServerToCopy, NewServer);
    xmldoc.AppendChild(deep);   //Throwing an exception here!
    xmldoc.Save(XMLInterfacesFile);            
 }

异常(exception):该文档已有“DocumentElement”节点。

有什么想法吗?

最佳答案

线

xmldoc.AppendChild(deep);   

尝试将元素附加到 XmlDocument。这意味着它正在尝试添加根级别元素。问题是您的文档已经具有根级元素(服务器)并且无法添加另一个元素,因此您会遇到异常。

您的代码的另一个问题是行

deep.InnerXml = deep.InnerXml.Replace(ServerToCopy, NewServer);

您正试图用新名称替换服务器名称。不幸的是 InnerXml 看起来像这样:

<Host>0.0.0.0</Host>
<Port>12</Port>
<User>USER</User>

因此您的服务器名称永远不会被替换。

要解决问题,您可以尝试不同的方法:

// Fint the node you want to replace
XmlNode NodeToCopy = xmldoc.SelectSingleNode("Servers/" + ServerToCopy);

// Create a new node with the name of your new server
XmlNode newNode = xmldoc.CreateElement(NewServer);

// set the inner xml of a new node to inner xml of original node
newNode.InnerXml = NodeToCopy.InnerXml;

// append new node to DocumentElement, not XmlDocument
xmldoc.DocumentElement.AppendChild(newNode);

这应该会给你你需要的结果

关于c# - 如何制作 XML 节点的副本及其所有子节点和值但名称不同 C# .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185463/

相关文章:

c# - 我们怎样才能加快从 MSMQ 接收消息的速度?

r - R不同文件结构中的XML数据

java - 使用 API 在 Google 文档中导入 XML 数据源

xml - 更改 XML 元素顺序,同时保持结构层次和属性

c# - 如何通过 System.Data.SQLite 检索 F# 查询表达式的 SQL 查询字符串?

c# - Web Api 2 中的 Mvc 样式参数绑定(bind)?

c# - 如何访问父表单函数?

c# - 为什么 ICommand 对象必须公开才能在 WPF 中正常工作?

.net - Visual Studio 安装项目 - .net 4 可以与项目一起部署吗?

c# - 快速清除以下列表或适当的 .NET 集合的方法