解析 Delphi 中的 XML 文件

5
首先,我是新手程序员,对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>

谢谢。

我会在几分钟内发布一个答案,向您展示一种方法来解决这个问题。同时,您的xml文件中存在一些错误。email_address和website节点的结束标签应该在其开头而不是结尾处有斜杠,并且最后的<customers>应该是</customers>。 - MartynA
刚刚才注意到,抱歉我不知道为什么会这样写。 - Sharpie
2
然后[编辑]您的帖子以修复它,下次发布有效的XML而不是您刚刚在问题中键入的内容。如果发布有效的数据或代码不值得您的时间,那么为什么我们要花时间来解决您的问题呢? - Ken White
3个回答

11

你的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;

5
根据您的 Delphi SKU(软件开发工具),如果它带有 XMLMapper 工具(在 Delphi 的 Bin 目录中),则可以很容易地使用 Delphi 组件实现此操作。
创建一个新项目,其中包含:
- 一个 TClientDataSet - 一个 TDatasource - 一个 TDbGrid
将数据源连接到 CDS,将网格连接到数据源;
添加一个 XMLTransformerProvider。
将 CDS 的 ProviderName 设置为 XMLTransformerProvider 的名称。
在 FormCreate 事件中打开 CDS。
保存该项目。
然后,在根据我的评论更正您的 XML 文件后,将其加载到 Delphi 的 XMLMapper 中。
在 XML Mapper 中:
- 选择 LH、Document 窗格的 DocumentView 选项卡 - 依次双击地址名称和网站节点 - 在菜单中单击 Create | DataPacket from XML - 在中央 Transformation 窗格的 Mapping 选项卡上单击 Create and Test Transformation 按钮。 - 转至 File | Save | Transformation 菜单,保存您的 .Xtr 文件。
回到您的 Delphi 项目中,将 XMLTransformProvider 的 XMLDataFile 属性指向您的 XML 文件,将其 TransformRead 子组件的 TransformationFile 指向您的 .Xtr 文件。
编译并运行您的项目。
在您的 CDS 中创建的 TFields 的类型和大小由 XMLMapper 生成的 .Xtr 文件确定。您可以按如下方式微调:
在 XMLMapper 中:
- 选择 Transformation 窗格的 Node Properties 选项卡。 - 在 Document 选项卡的 Document View 中,单击其中一个数据节点。 - 您可以在 Node Properties 选项卡上设置其 Data Type 和 Max Length。

如果我没记错的话,这个解决方案需要 Delphi Enterprise 版本(XML 数据绑定不包含在 Delphi Professional 中)。 - mjn
@mjn:谢谢,我已经确认了答案。 - MartynA
“创建和测试转换”按钮变灰了吗? - Sharpie
@Dag:在那种情况下,在执行该步骤之前,请转到菜单中的“创建 | 来自XML的DataPacket”。 - MartynA
我已经完成了所有操作,但是网格上没有显示任何内容。我忘记提到我使用了cxGrid组件,这会导致问题吗? - Sharpie
显示剩余3条评论

1
如果XML的结构类似于单个扁平数据集,您可以使用XML Schema Binding Wizard(包含在Delphi Professional中)创建包括读取器和写入器类的Delphi包装器。
基本步骤是:
- 创建代表XML结构的XSD文件 - 运行XML Schema Binding Wizard
第一步可以手动完成,也可能有工具可以根据示例XML为您生成XSD。但对于您的XML而言,编写XSD似乎相当容易。
Delphi生成了一组易于使用的类,可用于读取、修改和编写XML文档。

向导还将根据XML文件生成XSD和读取器/写入器类。 - TomT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接