代码之家  ›  专栏  ›  技术社区  ›  Sharpie

解析xml文件Delphi

  •  5
  • Sharpie  · 技术社区  · 9 年前

    首先,我刚接触编码和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>
    

    谢谢

    3 回复  |  直到 9 年前
        1
  •  11
  •   Leo Melo    9 年前

    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;
    
        2
  •  5
  •   MartynA    9 年前

    根据您的Delphi SKU,如果Delphi组件附带XMLMapper实用程序(位于Delphi的Bin目录中),您可以很容易地使用Delphi组件来实现这一点。

    创建包含以下内容的新项目

    • TClientDataSet
    • 一个TDatasource
    • 一个TDbGrid

    将数据源连接到CDS,将网格连接到数据源;

    • 添加XMLTransformerProvider

    将CDS的ProviderName设置为XMLTransformerProvider的名称

    在FormCreate事件中,打开CDS。

    保存项目。

    然后,按照我在评论中提到的那样更正XML文件后, 将其加载到Delphi的XMLMapper中。

    在XML Mapper中,

    • 选择 文档视图 左侧“文档”窗格的选项卡

    • 依次双击每个节点address_name..website

    • 点击 从XML创建|DataPacket 在菜单中

    • 单击 创建和测试转换 按钮。

    • 从菜单中,转到 文件|保存|转换 并保存.Xtr文件。

    回到Delphi项目中,将XMLTransformProvider的XMLDataFile属性指向XML文件; 它的TransformRead zub组件的TransformationFile位于.Xtr文件中。

    编译&运行项目。

    CDS中创建的TField的类型和大小由XMLMapper生成的.Xtr文件确定。您可以按如下方式微调这些参数:

    在XMLMapper中:

    • 选择 节点属性 的选项卡 转型 窗玻璃

    • 文档视图 的选项卡 文件 窗格中,单击其中一个数据节点-

    • 然后可以设置 数据类型 最大长度 节点属性 选项卡。

        3
  •  1
  •   mjn anonym    9 年前

    如果XML的结构类似于单个平面数据集,则可以使用XMLSchema绑定向导(包含在Delphi Professional中)创建包括读取器和写入器类的Dephi包装器。

    基本步骤如下

    • 创建表示XML结构的XSD文件
    • 运行XML架构绑定向导

    第一步可以手动完成,也许还有一些工具可以根据示例XML为您生成XSD。但是对于您的XML来说,自己编写XSD似乎相当容易。

    Delphi生成了一组易于使用的类,可用于读取、修改和编写XML文档。