如何在delphi中创建xml文件

Abd*_*lam 13 delphi delphi-7

我是delphi的新手,现在我必须阅读创建一个xml.我的代码如下:

unit writexml1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xmldom, XMLIntf, StdCtrls, msxmldom, XMLDoc;

type
  TForm1 = class(TForm)
    XMLDocument1: TXMLDocument;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SaveClick(Sender: TObject);
var
  rootName: String;
  childNode: String;
  attrChild: string;
  iXml: IDOMDocument;
  iRoot, iNode, iNode2, iChild, iAttribute: IDOMNode;
  XMLDoc: TXMLDocument;
begin
  XMLDoc.Active := False;
  XMLDoc.XML.Text := '';
  XMLDoc.Active := True;
  XMLDoc.SaveToFile('C:\Documents and Settings\a\Desktop\zulfa.xml');
  iXml := XMLDoc.DOMDocument;
  iRoot := iXml.appendChild(iXml.createElement('xml'));
  iNode := iRoot.appendChild(iXml.createElement('test'));
  iNode.appendChild(iXml.createElement('test2'));
  iChild := iNode.appendChild(iXml.createElement('test3'));
  iChild.appendChild(iXml.createElement('Simple calue'));
  iNode.insertBefore(iXml.createElement('test4'), iChild);
  iNode2 := iNode.cloneNode(True);
  iRoot.appendChild(iNode2);
  iAttribute := iXml.createAttribute('color');
  iAttribute.nodeValue := 'red';
  iNode2.attributes.setNamedItem(iAttribute);
end;

end.
Run Code Online (Sandbox Code Playgroud)

问题是,单击保存按钮时会显示异常,例外情况是

Project writexml1.exe raised exception class EAccessViolation  with message 
'Access violation at address 004391B9 in module writexml.exe
Run Code Online (Sandbox Code Playgroud)

kno*_*ker 34

你的代码看起来有点复杂.我建议:忘记TXMLDocumentIDOMDOCUMENT使用IXMLDOCUMENT代替(顺便到IST使用它几乎是相同的,然后TXmlDocument,但你不需要的组件).

这段代码应该证明它有多简单:

{...}
Var
  XML : IXMLDOCUMENT;
  RootNode, CurNode : IXMLNODE;
begin
  XML := NewXMLDocument;
  XML.Encoding := 'utf-8';
  XML.Options := [doNodeAutoIndent]; // looks better in Editor ;)
  RootNode := XML.AddChild('XML');
  CurNode := RootNode.AddChild('Test');
  CurNode := CurNode.AddChild('Test2');
  CurNode.Text := 'Some Test 2 text';
  CurNode.Attributes['NewAttribute'] := 'Some Test2 Attribute Value';
  XMl.SaveToFile('C:\Documents and Settings\a\Desktop\zulfa.xml');
{...}
Run Code Online (Sandbox Code Playgroud)

这是生成的文件的样子:

<?xml version="1.0" encoding="utf-8"?>
<XML>
  <Test>
    <Test2 NewAttribute="Some Test2 Attribute Value">Some Test 2 text</Test2>
  </Test>
</XML>
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助

PS:这个示例只需要单位XMLIntfXmlDoc,这样你就可以整理一下你的用法.


Clo*_*ble 13

您需要先创建XMLDoc实例,然后才能使用它:

XMLDoc := TXMLDocument.Create(...);
try
  ... do stuff with XMLDOC
finally
  XMLDoc.Free;
end;
Run Code Online (Sandbox Code Playgroud)

  • 但要小心.使用`nil`所有者动态创建`TXMLDocument`会导致`TXMLDocument`充当接口而不是对象.在这样的实例上调用`Free()`会非常糟糕.如果你想使用`Free()`,那么你必须提供一个非`所有'的所有者(在这种情况下,`Free()`是多余的,因为当所有者被释放时,所有者将释放`TXMLDocument` ).如果你用`nil`所有者动态分配`TXMLDocument`,你必须将它分配给`IXMLDocument`变量,在这种情况下使用`NewXMLDocument()`而不是`TXMLDocument.Create(nil)`. (6认同)
  • @truthseeker:`NewXmlDocument()`返回一个引用计数的`IXMLDocument`接口。当不再有对它的引用时,它会自动释放。您可以正常让它超出范围,或者如果您想提前释放它,也可以为其分配 `nil` 。 (2认同)

Rem*_*eau 11

SaveClick()在使用i之前声明一个XMLDoc未分配有效TXMLDocument对象的局部变量.您有一个单独的XMLDocument1组件,TForm但您没有使用它.摆脱XMLDoc并使用XMLDocument1.

此外,您正在DOMDocument直接访问底层.使用TXMLDocument自己的方法来构建XML,不要下载到DOM层,除非您需要访问特定于供应商的功能(在这种情况下您不需要).

试试这个:

procedure TForm1.SaveClick(Sender: TObject); 
var 
  iRoot, iNode, iNode2, iChild: IXMLNode; 
begin 
  XMLDocument1.Active := False;
  XMLDocument1.XML.Text := '';    
  XMLDocument1.Active := True;
  iRoot := XMLDocument.AddChild('xml'); 
  iNode := iRoot.AddChild('test'); 
  iNode.AddChild('test2'); 
  iChild := iNode.AddChild('test3'); 
  iChild.Text := 'Simple value'; 
  iNode.AddChild('test4', iNode.ChildNodes.IndexOf(iChild)); 
  iNode2 := iNode.CloneNode(True); 
  iRoot.ChildNodes.Add(iNode2); 
  iNode2.Attributes['color'] := 'red'; 
  XMLDocument1.SaveToFile('C:\Documents and Settings\a\Desktop\zulfa.xml'); 
  XMLDocument1.Active := False;
end; 
Run Code Online (Sandbox Code Playgroud)

这会产生以下XML:

<?xml version="1.0" encoding="utf-8"?>
<xml>
  <test>
    <test2 />     
    <test4 />
    <test3>Simple value</test3>
  </test>
  <test color="red">
    <test2 />     
    <test4 />
    <test3>Simple value</test3>
  </test>
</xml>
Run Code Online (Sandbox Code Playgroud)

话虽如此,使用IXMLDocument而不是TXMLDocument像@knowledgestacker建议的那样,通常是一个更好的选择.