正在解析 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;