gpt4 book ai didi

xml - 在Delphi 10.1中生成XML文件并执行基本的XML操作?

转载 作者:行者123 更新时间:2023-12-02 04:34:15 26 4
gpt4 key购买 nike

我想使用以下格式在 Delphi 10.1 中创建 XML 文件

<EmployeeDB>
<Employees>
<Employee e.id="1">
<eName>value from Edit Box edtName</eName>
<ePlace>value from Edit Box edtPlace</ePlace>
</Employee >
<Employee e.id="2">
<eName>value from Edit Box edtName</eName>
<ePlace>value from Edit Box edtPlace</ePlace>
</Employee >
<Employee e.id="3">
<eName>value from Edit Box edtName</eName>
<ePlace>value from Edit Box edtPlace</ePlace>
</Employee >
</Employees>
</EmployeeDB>

我想从注册表中获取数据,当单击“确定”按钮时,它应该将编辑框、单选按钮等中的数据添加到 XML 文件中。

我是 Delphi 编程新手,请帮我解决这个问题。

我尝试用这种方式编写代码:

unit XMLTrail;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, XMLIntf, XMLDoc, ComObj, xmldom,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
Tfrm_XMLTrail = class(TForm)
edt_eID: TEdit;
edtName: TEdit;
edtPlace: TEdit;
Memo1: TMemo;
btnAdd: TButton;
procedure btn_AddClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure LoadXML;
procedure SaveXML;
public
{ Public declarations }
XMLDoc1: TXmlDocument;

iNode, Root1, Root2, Child_Attrib_Name, Child_Attrib_Place: IXmlNode;
function GetEmployeeDBNode(XMLDoc: TXmlDocument): IXmlNode;
function GetEmployeesNode(EmployeeDBNode: IXmlNode): IXmlNode;

end;

var
frm_XMLTrail: Tfrm_XMLTrail;

implementation

{$R *.dfm}

const
scXmlTemplate = '<EmployeeDB>'#13#10 + ' <Employees>'#13#10 +
' </Employees>'#13#10 + '</EmployeeDB>';

scXmlFileName =
'C:\Users\Rajesh\Documents\Embarcadero\Studio\Projects\Samples\XML trail\Win32\Debug\nicexml.xml';

procedure Tfrm_XMLTrail.btn_AddClick(Sender: TObject);
begin
XMLDoc1.Active := true;
iNode := XMLDoc1.DocumentElement;
Root1 := iNode.ChildNodes.FindNode('Employees');
Root2 := Root1.AddChild('Employee');
Root2.Attributes['e.id'] := edt_eID.Text;
Child_Attrib_Name := Root2.AddChild('eName');
Child_Attrib_Name.Text := edtName.Text;
Child_Attrib_Place := Root2.AddChild('ePlace');
Child_Attrib_Place.Text := edtPlace.Text;
XMLDoc1.Active := true;
XMLDoc1.SaveToFile(scXmlFileName);

end;

procedure Tfrm_XMLTrail.FormCreate(Sender: TObject);
begin
XMLDoc1 := TXmlDocument.Create(nil);
if not FileExists(scXmlFileName) then
begin
// XMLDoc1 := TXmlDocument.Create(nil);
XMLDoc1.Active := true;
XMLDoc1.Options := [doNodeAutoIndent];
iNode := XMLDoc1.AddChild('UmangEmployeeDB');
Root1 := iNode.AddChild('Employees');
end
else
begin
LoadXML;
end;
end;

procedure Tfrm_XMLTrail.LoadXML;
begin
XMLDoc1.LoadFromFile(scXmlFileName);
Memo1.Lines.Text := XMLDoc1.XML.Text;
// SaveXML;
// Memo1.Lines.LoadFromFile(scXmlFileName);

// XMLDoc1 := TXmlDocument.Create(nil);
// Assert(Root1 <> Nil);
end;

procedure Tfrm_XMLTrail.SaveXML;
begin
Memo1.Lines.SaveToFile(scXmlFileName);
end;

end.

但它返回了如下所示的 XML 文件:

<EmployeeDB>
<Employees>
<Employee e.id="2">
<eName>sssss</eName>
<ePlace>fgr</ePlace>
</Employee>
<Employee e.id="2">
<eName>sssss</eName>
<ePlace>fgr</ePlace>
</Employee>
</Employees>
</EmployeeDB>

应用程序的 UI 如下 Image .

当我输入数据后单击“确定”按钮时,它应该通过创建新的 <Employee/> 将数据写入 XML 文件。每次单击“确定”按钮时都会节点。

最佳答案

我通常不喜欢提交第二个答案,但你似乎没有遵循我在第一篇中所说的。

下面是一个示例项目,它生成一个新的 Xml 文件并添加一个新的 Employee每次单击 btnAdd 按钮时都会指向它。代码中的注释应该足以让您继续前进。

请注意,该项目使用 MSXML.Pas 单元中定义的 Xml 接口(interface),它使用 XmlDoc 单元。

unit XmlGenerateu;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, MSXML;

type
TForm1 = class(TForm)
Memo1: TMemo;
edtName: TEdit;
edtPlace: TEdit;
btnAdd: TButton;
procedure btnAddClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure LoadXML;
procedure SaveXML;
procedure GenerateXML;
function CreateEmployeeNode: IXmlDomElement;
protected
public
XMLDoc : IXmlDomDocument;
EmployeesNode : IXmlDomNode;
NewEmployeeNode : IXmlDomNode;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

const
scXmlTemplate =
'<EmployeeDB>'#13#10
+ ' <Employees>'#13#10
+ ' </Employees>'#13#10
+ '</EmployeeDB>';

scXmlFileName = 'C:\Temp\Employees.Xml';

procedure TForm1.btnAddClick(Sender: TObject);
begin
NewEmployeeNode := CreateEmployeeNode;
Memo1.Lines.Text := XmlDoc.xml;
SaveXML;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
LoadXML;
end;

procedure TForm1.LoadXML;
begin
// If there is no existing Xml file create it from our Xml template
// and save it to disk
if not FileExists(scXmlFileName) then begin
Memo1.Lines.Text := scXmlTemplate;
SaveXML;
end;
Memo1.Lines.LoadFromFile(scXmlFileName);

// Create the XmlDoc object
XmlDoc := CoDomDocument.Create;
// Load it from Memo1
Assert(XmlDoc.LoadXml(Memo1.Lines.Text));

// Find the Employees node
EmployeesNode := XmlDoc.selectSingleNode('/EmployeeDB/Employees');
// Complain if we didn't find it
Assert(EmployeesNode <> Nil);

end;

procedure TForm1.SaveXML;
begin
Memo1.Lines.SaveToFile(scXmlFileName);
end;

function TForm1.CreateEmployeeNode : IXmlDomElement;
var
EmployeeID : Integer;
NameElement,
PlaceElement : IXmlDomElement;
begin
// First, generate the ID for the new Employee
EmployeeID := EmployeesNode.childNodes.length + 1;

// Next, get the XmlDoc to create a new Element
Result := XmlDoc.createElement('Employee');

// Set the new Element's ID attribute
Result.setAttribute('e.id', IntToStr(EmployeeID));

// Put the new Employee node at the end of the list of Employee nodes
EmployeesNode.appendChild(Result);

// Finally, createt eName and ePlace children of the new Employee
NameElement := XmlDoc.createElement('eName');
NameElement.text := edtName.Text;
Result.appendChild(NameElement);

PlaceElement := XmlDoc.createElement('ePlace');
PlaceElement.text := edtPlace.Text;
Result.appendChild(PlaceElement);
end;

更新

您在评论中询问是否可以使用 TXmlDocument 而不是来完成此操作MSXML.Pas 单元中的接口(interface)。我认为这将是一个很好的 self 指导练习,因此我不会包含完成它的完整代码,但这里有一些提示。

需要进行一些细节更改,例如如何加载 XMLDocumentMemo1,但主要的变化是如何找到Employees节点XML 文档的。最简单的方法是使用 XPath 查询(请参阅上面代码中的 SelectSingleNode),但这涉及使用相同的 XML 接口(interface)就像 MSXML.Pas 中一样,如果你想这样做,你最好避免使用TXml文档。如果你想避免使用 XPath,那么你可以编写两个函数,它返回 EmployeeDB 和Employees 节点。这些可能看起来像这样

function TForm1.GetEmployeeDBNode(XmlDoc : TXmlDocument) : IXmlNode;
begin
Result := XmlDoc.DocumentElement;
Assert(Result <> Nil);
Assert(Result.NodeName = 'EmployeeDB');
end;

function TForm1.GetEmployeesNode(EmployeeDBNode : IXmlNode) : IXmlNode;
begin
Result := EmployeeDBNode.ChildNodes.First;
Assert(Result <> Nil);
Assert(Result.NodeName = 'Employees');
end;

您可以在 CreateEmployeeNode 的改编版本中使用这些函数通过在节点上调用 AddChild('Employee') 添加新的 Employee 节点由 GetEmployeesNode 返回。

顺便说一句,需要编写这些函数,假设 XML 文档具有固定的结构,说明为什么使用 XPath 更好,因为它更容易容纳不同的 XML 结构,例如,如果 EmployeeDB 嵌入到一些更大的 Xml 结构中。使用 XPath,只需更改 XPath 查询字符串即可。

关于xml - 在Delphi 10.1中生成XML文件并执行基本的XML操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39740872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com