正在解析 xml 文件 Delphi
Parsing xml file Delphi
首先,我是编码新手,Delphi,断断续续使用了几个月。
下面是一个示例 xml 文件。
我想要实现的是解析 .xml 文件每个 'Name' 部分中的所有数据。
我以前从未这样做过。一些指导将不胜感激。我在这里看过其他与此类似的问题,但我无法完全理解它。
我没有可提供的代码示例....这就是我的困境,我不知道从哪里开始。
<ds>
<Customers>
<Name>
<address_name>test 1</address_name>
<address_line_1>test 1</address_line_1>
<address_line_2>test 1</address_line_2>
<address_line_3>test 1</address_line_3>
<postcode>test 1</postcode>
<tel_no>test 1</tel_no>
<fax_no>test 1</fax_no>
<email_address>test 1<email_address/>
<website>test 1<website />
</Name>
<Name>
<address_name>test 2</address_name>
<address_line_1>test 2</address_line_1>
<address_line_2>test 2</address_line_2>
<address_line_3>test 2</address_line_3>
<postcode>test 2</postcode>
<tel_no>test 2</tel_no>
<fax_no>test 2</fax_no>
<email_address>test 2<email_address/>
<website>test 2<website />
</Name>
<Name>
<address_name>test 3</address_name>
<address_line_1>test 3</address_line_1>
<address_line_2>test 3</address_line_2>
<address_line_3>test 3</address_line_3>
<postcode>test 3</postcode>
<tel_no>test 3</tel_no>
<fax_no>test 3</fax_no>
<email_address>test 3<email_address/>
<website>test 3<website />
</Name>
<Customers>
</ds>
谢谢,
根据您的 Delphi SKU,如果 XMLMapper 实用程序(在 Delphi 的 Bin 中)附带 Delphi 组件,您可以非常轻松地完成此操作目录)。
创建一个包含
的新项目
- 一个 TClientDataSet
- 一个 TDatasource
- 一个 TDbGrid
将数据源连接到 CDS,将网格连接到数据源;
- 添加一个XMLTransformerProvider
将 CDS 的 ProviderName 设置为 XMLTransformerProvider
的名称
在 FormCreate 事件中,打开 CDS。
保存项目。
然后,按照我在评论中提到的那样更正您的 XML 文件后,
将其加载到 Delphi 的 XMLMapper.
在 XML 映射器中,
Select 左侧文档窗格的 DocumentView 选项卡
依次双击每个节点address_name..网站
单击创建 |来自菜单XML的数据包
单击中央“转换”窗格的“映射”选项卡上的创建和测试转换 按钮。
从菜单中转到 文件 |保存 |转换 并保存您的 .Xtr 文件。
返回您的 Delphi 项目,将 XMLTransformProvider 的 XMLDataFile 属性 指向您的 XML 文件,&
.Xtr 文件中其 TransformRead zub 组件的 TransformationFile。
编译并运行你的项目。
在您的 CDS 中创建的 TFields 的类型和大小由 XMLMapper 生成的 .Xtr 文件决定。您可以按如下方式微调:
在XML映射器中:
Select 节点属性 转换 窗格的选项卡。
在文档窗格的文档视图选项卡中,单击其中一个数据节点-
然后您可以在Node Propertyies[上设置它的数据类型和最大长度 =83=] tab.
如果 XML 的结构类似于单个平面数据集,您可以使用 XML 架构绑定向导创建包括 reader 和编写器 类 的 Dephi 包装器(包含在 Delphi 专业中)。
基本步骤是
- 创建一个代表 XML 结构的 XSD 文件
- 运行 XML 架构绑定向导
第一步可以手动完成,也许还有工具可以根据样本 XML 为您生成 XSD。但是对于你的 XML 来说,自己写 XSD 似乎很容易。
Delphi 生成一组易于使用的 类,可用于阅读、修改和编写 XML 文档。
您的 xml 文件的更好方法是:
<ds>
<Customers>
<Customer>
<address_name>test 1</address_name>
<address_line_1>test 1</address_line_1>
<address_line_2>test 1</address_line_2>
<address_line_3>test 1</address_line_3>
<postcode>test 1</postcode>
<tel_no>test 1</tel_no>
<fax_no>test 1</fax_no>
<email_address>test 1</email_address>
<website>test 1</website>
</Customer>
<Customer>
<address_name>test 2</address_name>
<address_line_1>test 2</address_line_1>
<address_line_2>test 2</address_line_2>
<address_line_3>test 2</address_line_3>
<postcode>test 2</postcode>
<tel_no>test 2</tel_no>
<fax_no>test 2</fax_no>
<email_address>test 2</email_address>
<website>test 2</website>
</Customer>
<Customer>
<address_name>test 3</address_name>
<address_line_1>test 3</address_line_1>
<address_line_2>test 3</address_line_2>
<address_line_3>test 3</address_line_3>
<postcode>test 3</postcode>
<tel_no>test 3</tel_no>
<fax_no>test 3</fax_no>
<email_address>test 3</email_address>
<website>test 3</website>
</Customer>
</Customers>
</ds>
阅读此文件:
插入这两个用途:XMLDoc,XMLIntf;
这是读取您的 XML 文件的程序。
procedure TForm1.btnReadXmlFileClick(Sender: TObject);
var
XmlFile : TXMLDocument;
MainNode, CustomerNode : IXMLNode;
i : Integer;
XMLPath : string;
begin
XMLPath := 'Z:\Temp\xmlToRead.xml'; //example of path
XmlFile := TXMLDocument.Create(Application);
try
XmlFile.LoadFromFile(XMLPath);
XmlFile.Active := True;
MainNode := XmlFile.DocumentElement;
for i:=0 to MainNode.ChildNodes['Customers'].ChildNodes.Count-1 do
begin
CustomerNode := MainNode.ChildNodes['Customers'].ChildNodes[i];
//Here you can get any imformation
ShowMessage(CustomerNode.ChildNodes['address_name'].Text);
ShowMessage(CustomerNode.ChildNodes['address_line_1'].Text);
end;
finally
FreeAndNil(XmlFile);
end;
end;
首先,我是编码新手,Delphi,断断续续使用了几个月。
下面是一个示例 xml 文件。
我想要实现的是解析 .xml 文件每个 'Name' 部分中的所有数据。
我以前从未这样做过。一些指导将不胜感激。我在这里看过其他与此类似的问题,但我无法完全理解它。
我没有可提供的代码示例....这就是我的困境,我不知道从哪里开始。
<ds>
<Customers>
<Name>
<address_name>test 1</address_name>
<address_line_1>test 1</address_line_1>
<address_line_2>test 1</address_line_2>
<address_line_3>test 1</address_line_3>
<postcode>test 1</postcode>
<tel_no>test 1</tel_no>
<fax_no>test 1</fax_no>
<email_address>test 1<email_address/>
<website>test 1<website />
</Name>
<Name>
<address_name>test 2</address_name>
<address_line_1>test 2</address_line_1>
<address_line_2>test 2</address_line_2>
<address_line_3>test 2</address_line_3>
<postcode>test 2</postcode>
<tel_no>test 2</tel_no>
<fax_no>test 2</fax_no>
<email_address>test 2<email_address/>
<website>test 2<website />
</Name>
<Name>
<address_name>test 3</address_name>
<address_line_1>test 3</address_line_1>
<address_line_2>test 3</address_line_2>
<address_line_3>test 3</address_line_3>
<postcode>test 3</postcode>
<tel_no>test 3</tel_no>
<fax_no>test 3</fax_no>
<email_address>test 3<email_address/>
<website>test 3<website />
</Name>
<Customers>
</ds>
谢谢,
根据您的 Delphi SKU,如果 XMLMapper 实用程序(在 Delphi 的 Bin 中)附带 Delphi 组件,您可以非常轻松地完成此操作目录)。
创建一个包含
的新项目- 一个 TClientDataSet
- 一个 TDatasource
- 一个 TDbGrid
将数据源连接到 CDS,将网格连接到数据源;
- 添加一个XMLTransformerProvider
将 CDS 的 ProviderName 设置为 XMLTransformerProvider
的名称在 FormCreate 事件中,打开 CDS。
保存项目。
然后,按照我在评论中提到的那样更正您的 XML 文件后, 将其加载到 Delphi 的 XMLMapper.
在 XML 映射器中,
Select 左侧文档窗格的 DocumentView 选项卡
依次双击每个节点address_name..网站
单击创建 |来自菜单XML的数据包
单击中央“转换”窗格的“映射”选项卡上的创建和测试转换 按钮。
从菜单中转到 文件 |保存 |转换 并保存您的 .Xtr 文件。
返回您的 Delphi 项目,将 XMLTransformProvider 的 XMLDataFile 属性 指向您的 XML 文件,& .Xtr 文件中其 TransformRead zub 组件的 TransformationFile。
编译并运行你的项目。
在您的 CDS 中创建的 TFields 的类型和大小由 XMLMapper 生成的 .Xtr 文件决定。您可以按如下方式微调:
在XML映射器中:
Select 节点属性 转换 窗格的选项卡。
在文档窗格的文档视图选项卡中,单击其中一个数据节点-
然后您可以在Node Propertyies[上设置它的数据类型和最大长度 =83=] tab.
如果 XML 的结构类似于单个平面数据集,您可以使用 XML 架构绑定向导创建包括 reader 和编写器 类 的 Dephi 包装器(包含在 Delphi 专业中)。
基本步骤是
- 创建一个代表 XML 结构的 XSD 文件
- 运行 XML 架构绑定向导
第一步可以手动完成,也许还有工具可以根据样本 XML 为您生成 XSD。但是对于你的 XML 来说,自己写 XSD 似乎很容易。
Delphi 生成一组易于使用的 类,可用于阅读、修改和编写 XML 文档。
您的 xml 文件的更好方法是:
<ds>
<Customers>
<Customer>
<address_name>test 1</address_name>
<address_line_1>test 1</address_line_1>
<address_line_2>test 1</address_line_2>
<address_line_3>test 1</address_line_3>
<postcode>test 1</postcode>
<tel_no>test 1</tel_no>
<fax_no>test 1</fax_no>
<email_address>test 1</email_address>
<website>test 1</website>
</Customer>
<Customer>
<address_name>test 2</address_name>
<address_line_1>test 2</address_line_1>
<address_line_2>test 2</address_line_2>
<address_line_3>test 2</address_line_3>
<postcode>test 2</postcode>
<tel_no>test 2</tel_no>
<fax_no>test 2</fax_no>
<email_address>test 2</email_address>
<website>test 2</website>
</Customer>
<Customer>
<address_name>test 3</address_name>
<address_line_1>test 3</address_line_1>
<address_line_2>test 3</address_line_2>
<address_line_3>test 3</address_line_3>
<postcode>test 3</postcode>
<tel_no>test 3</tel_no>
<fax_no>test 3</fax_no>
<email_address>test 3</email_address>
<website>test 3</website>
</Customer>
</Customers>
</ds>
阅读此文件:
插入这两个用途:XMLDoc,XMLIntf;
这是读取您的 XML 文件的程序。
procedure TForm1.btnReadXmlFileClick(Sender: TObject);
var
XmlFile : TXMLDocument;
MainNode, CustomerNode : IXMLNode;
i : Integer;
XMLPath : string;
begin
XMLPath := 'Z:\Temp\xmlToRead.xml'; //example of path
XmlFile := TXMLDocument.Create(Application);
try
XmlFile.LoadFromFile(XMLPath);
XmlFile.Active := True;
MainNode := XmlFile.DocumentElement;
for i:=0 to MainNode.ChildNodes['Customers'].ChildNodes.Count-1 do
begin
CustomerNode := MainNode.ChildNodes['Customers'].ChildNodes[i];
//Here you can get any imformation
ShowMessage(CustomerNode.ChildNodes['address_name'].Text);
ShowMessage(CustomerNode.ChildNodes['address_line_1'].Text);
end;
finally
FreeAndNil(XmlFile);
end;
end;