如何制作 XML 节点的副本及其所有子节点和值但名称不同 C# .NET
How to make a copy of a XML node with all their child nodes and values but different name C# .NET
我正在尝试复制 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);
}
异常:该文档已有 'DocumentElement' 个节点。
有什么想法吗?
行
xmldoc.AppendChild(deep);
尝试将元素附加到 XmlDocument
。这意味着它正在尝试添加根级别元素。问题是您的文档已经具有根级元素 (Servers),并且无法添加另一个元素,因此您会遇到异常。
您的代码的另一个问题是行
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);
这应该会给您所需的结果
我正在尝试复制 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);
}
异常:该文档已有 'DocumentElement' 个节点。
有什么想法吗?
行
xmldoc.AppendChild(deep);
尝试将元素附加到 XmlDocument
。这意味着它正在尝试添加根级别元素。问题是您的文档已经具有根级元素 (Servers),并且无法添加另一个元素,因此您会遇到异常。
您的代码的另一个问题是行
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);
这应该会给您所需的结果