使用Delphi XE10合并两个XML文件

时间:2016-11-15 00:13:49

标签: xml delphi merge

我尝试将两个XML文件(使用MSword创建)与下面的代码合并,但是虽然它运行没有任何错误,但是当我尝试打开合并文件时收到错误消息。实际上,合并文件包含第一个文件内容加上第二行的第一行(行"<?xml版本=" 1.0"编码=" UTF -8" standalone =" yes"?>")。没有合并的内容!

//按钮选择第一个文件,然后button2选择第二个文件并合并它们

uses XML.xmlDoc,XML.XMLintf;

var XMLDoc1, XMLDoc2 : TXMLDocument;

procedure TForm30.Button1Click(Sender: TObject);
begin
    if OpenDialog1.Execute then begin
        XMLDoc1 := TXMLDocument.Create(self);
        XMLDoc1.Active := True;
        XMLDoc1.LoadFromFile(OpenDialog1.filename);
    end;
end;

procedure TForm30.Button2Click(Sender: TObject);
var ANode: IXMLNode;
begin
    if OpenDialog1.Execute then begin
        XMLDoc2 := TXMLDocument.Create(self);
        xmlDoc2.Active:= True;
        XMLDoc2.LoadFromFile(OpenDialog1.filename);
        ANode:= XMLDoc2.ChildNodes[0].CloneNode(True);
        xmlDoc1.ChildNodes.add(ANode);
        xmlDoc2.Active:= False;
        xmlDoc1.SaveToFile('c:\' + 'Merge.xml');
        XMLDoc1.free;
        XMLDoc2.free;
        aNode.free;
    end;
end;

我做错了什么,拜托? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

XML只能有1个顶级文档元素,但您的代码正在尝试创建2个顶级元素。

此外,您没有考虑XMLDoc2.ChildNodes[0]可能不是顶级文档元素。它可以是其他节点类型,如处理指令等。在这种情况下,它听起来是XML prolog节点。要访问顶级元素节点,请改用XMLDoc2.DocumentElement属性。

如果您需要将第二个文档的顶级元素添加为第一个文档的顶级元素的子元素,请尝试更类似的内容:

uses
  Xml.XmlDoc, Xml.XmlIntf;

var
  XMLDoc1, XMLDoc2 : IXMLDocument;

procedure TForm30.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then begin
    XMLDoc1 := LoadXMLDocument(OpenDialog1.FileName);
  end;
end;

procedure TForm30.Button2Click(Sender: TObject);
var
  ANode: IXMLNode;
begin
  if OpenDialog1.Execute then begin
    XMLDoc2 := LoadXMLDocument(OpenDialog1.FileName);
    ANode := XMLDoc2.DocumentElement.CloneNode(True);
    XMLDoc1.DocumentElement.ChildNodes.Add(ANode);
    XMLDoc1.SaveToFile('C:\Merge.xml');
    XMLDoc1 := nil;
    XMLDoc2 := nil;
  end;
end;

另一方面,如果您需要保留两份文件'在顶级元素中,您必须使用自己的顶级元素创建一个新文档,然后将这两个文档添加为子文档:

uses
  Xml.XmlDoc, Xml.XmlIntf;

var
  XMLDoc1, XMLDoc2 : IXMLDocument;

procedure TForm30.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then begin
    XMLDoc1 := LoadXMLDocument(OpenDialog1.FileName);
  end;
end;

procedure TForm30.Button2Click(Sender: TObject);
var
  ANode: IXMLNode;
  XMLDoc3: IXMLDocument;
begin
  if OpenDialog1.Execute then begin
    XMLDoc2 := LoadXMLDocument(OpenDialog1.FileName);
    XMLDoc3 := NewXMLDocument;
    ANode := XMLDoc3.AddChild('merged');
    ANode.ChildNodes.Add(XMLDoc1.DocumentElement.CloneNode(True));
    ANode.ChildNodes.Add(XMLDoc2.DocumentElement.CloneNode(True));
    XMLDoc3.SaveToFile('C:\Merge.xml');
    XMLDoc1 := nil;
    XMLDoc2 := nil;
  end;
end;