Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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
如何将子节点结构从一个XML文件复制到另一个XML文件(合并两个XML文件)?_Xml_Delphi_Xml Parsing - Fatal编程技术网

如何将子节点结构从一个XML文件复制到另一个XML文件(合并两个XML文件)?

如何将子节点结构从一个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作为字符串进行操作来找到解决方案 但我认为可能有更好的解决方案直接

我有以下两个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作为字符串进行操作来找到解决方案


但我认为可能有更好的解决方案直接使用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是从创建此节点的文档以外的文档创建的。”。如何解决这个问题?我在一个新的问题中阐述了这一点: