如何将子节点结构从一个XML文件复制到另一个XML文件(合并两个XML文件)?
我有以下两个XML文件: File1如何将子节点结构从一个XML文件复制到另一个XML文件(合并两个XML文件)?,xml,delphi,xml-parsing,Xml,Delphi,Xml Parsing,我有以下两个XML文件: File1 101 102 103 501 502 503 文件2 454 471 498 723 645 823 在Delphi中,我想将文件2的完整..结构添加到重命名为..的文件1中。所以结果应该是这样的: 101 102 103 501 502 503 454 471 498 723 645 823 我已经问过如何提取问题中的…块 (这确实是一个XY问题,对此很抱歉)我可以通过将XML作为字符串进行操作来找到解决方案 但我认为可能有更好的解决方案直接
101
102
103
501
502
503
文件2
454
471
498
723
645
823
在Delphi中,我想将文件2的完整..
结构添加到重命名为..
的文件1中。所以结果应该是这样的:
101
102
103
501
502
503
454
471
498
723
645
823
我已经问过如何提取问题中的…
块
(这确实是一个XY问题,对此很抱歉)我可以通过将XML作为字符串进行操作来找到解决方案
但我认为可能有更好的解决方案直接使用XML功能。那么,我如何在Delphi 10中实现这一点呢?一旦将XML文件解析为/objects,就可以将对象从一个文档克隆/移动到另一个文档(请参见、或和)。虽然不能重命名节点,但可以使用所需名称创建新节点(请参见),然后在新节点下克隆/移动旧节点的子节点 您不应该为这些任务使用XML字符串。改为操纵DOM树。因此,您可以在文件2中为
获取IXMLNode
,在文件1中为
添加一个新的IXMLNode
,然后将
和
从文件2中的IXMLNode
克隆/移动到文件1中的IXMLNode
也就是说,为什么您的元素以顺序命名<代码>,
,
等就足够了。您可以根据需要在一个文档中包含多个
、多个
和多个
。XML善于使用重复的元素名。您实际上不需要在元素名称中使用序号,例如:
101
102
103
501
502
503
454
471
498
723
645
823
如果确实需要通过数字进行区分,可以使用属性,例如:
101
102
103
501
502
503
454
471
498
723
645
823
您可以使用
下面是一个完整的示例:
uses XMLIntf, XMLDoc, xmldom;
procedure Test;
var
XML1, XML2: DOMString;
Doc1, Doc2: IXMLDocument;
NewNode, Node1: IXMLNode;
i: integer;
begin
XML1 := '<?xml version="1.0"?><main><node1><subnode>1</subnode></node1></main>';
Doc1 := LoadXMLData(XML1);
NewNode := Doc1.DocumentElement.AddChild('node2');
XML2 := '<?xml version="1.0"?><main><node1><subnode>2</subnode></node1></main>';
Doc2 := LoadXMLData(XML2);
Node1 := Doc2.DocumentElement.ChildNodes['node1'];
// Clone nodes from Doc2 to Doc1
for i := 0 to Node1.ChildNodes.Count - 1 do
NewNode.ChildNodes.Add(Node1.ChildNodes[i].CloneNode(true));
Doc1.SaveToFile('merged.xml');
end;
使用XMLIntf、XMLDoc、xmldom;
程序测试;
变量
XML1,XML2:DOMString;
Doc1、Doc2:IXMLDocument;
新节点,节点1:IXMLNode;
i:整数;
开始
XML1:=“1”;
Doc1:=加载xmldata(XML1);
NewNode:=Doc1.DocumentElement.AddChild('node2');
XML2:='2';
Doc2:=加载xmldata(XML2);
Node1:=Doc2.DocumentElement.ChildNodes['Node1'];
//将节点从Doc2克隆到Doc1
对于i:=0到Node1.ChildNodes.Count-1 do
NewNode.ChildNodes.Add(Node1.ChildNodes[i].CloneNode(true));
Doc1.SaveToFile('merged.xml');
结束;
谢谢!如果我使用默认的DOMVendor,这似乎是可行的。但是,如果我将Omni XML用作DOMDvendor,当克隆节点添加到ChildNodes列表中时,我将收到一条EXMLException消息,消息为“NewChild是从创建此节点的文档以外的文档创建的。”。如何解决这个问题?我在一个新的问题中阐述了这一点: