Как создать XML файл в delphi
Я новичок в 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.
Проблема заключается в том, что при нажатии кнопки сохранения отображается исключение, исключение составляет
Project writexml1.exe raised exception class EAccessViolation with message
'Access violation at address 004391B9 in module writexml.exe
Ответы
Ответ 1
ваш код выглядит немного сложнее. Я бы предложил: забудьте TXMLDocument
и IDOMDOCUMENT
, вместо этого используйте IXMLDOCUMENT
(способ использовать его почти так же, как и 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');
{...}
Вот как выглядел бы получившийся файл:
<?xml version="1.0" encoding="utf-8"?>
<XML>
<Test>
<Test2 NewAttribute="Some Test2 Attribute Value">Some Test 2 text</Test2>
</Test>
</XML>
Я надеюсь, что это поможет
PS: для этого образца нужны только узлы XMLIntf и XmlDoc, поэтому вы можете немного приукрасить свое использование.
Ответ 2
Вам нужно создать экземпляр XMLDoc
, прежде чем вы сможете его использовать:
XMLDoc := TXMLDocument.Create(...);
try
... do stuff with XMLDOC
finally
XMLDoc.Free;
end;
Ответ 3
SaveClick()
объявляет локальную переменную XMLDoc
, которая не назначает действительный объект TXMLDocument
, прежде чем использовать i. У вас есть отдельный компонент 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;
Это создает следующий 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>
С учетом сказанного, используя IXMLDocument
вместо TXMLDocument
, как предлагается @knowledgestacker, обычно это лучший выбор.