zoukankan      html  css  js  c++  java
  • Delphi 中的 XMLDocument 类详解(14) 遍历 XML 文件

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;
    
    type
      TForm1 = class(TForm)
        XMLDocument1: TXMLDocument;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    
    //读取 xml 的函数
    {
      功能1: 传入一个节点参数, 返回节点及其包含的所有内容;
      功能2: 排除了空节点.
    }
    function ReadXml(node: IXMLNode): string;
    var
      nodeList,attrList: IXMLNodeList;
      str,strName,strValue: string;
      i: Integer;
    begin
      Result := '';
      if not node.HasChildNodes then Exit;
    
      attrList := node.AttributeNodes;      {根节点的属性列表}
      nodeList := node.ChildNodes;          {根节点下的子节点列表}
    
      str := '<' + node.NodeName;
    
      {先读取属性}
      for i := 0 to attrList.Count - 1 do
      begin
        strName := attrList[i].NodeName;
        strValue := attrList[i].NodeValue;
        str := str + ' ' + strName + '=' + AnsiQuotedStr(strValue, '"');
      end;
      str := str + '>' + sLineBreak; {sLineBreak 是常量, 相当于 #13#10}
    
      {读取子节点}
      for i := 0 to nodeList.Count - 1 do
      begin
        strName := nodeList[i].NodeName;
        if nodeList[i].IsTextElement then
        begin
          strValue := nodeList[i].NodeValue;
          str := str + '<' + strName + '>' + strValue + '</' + strName + '>' + sLineBreak;
        end else if nodeList[i].HasChildNodes then
        begin
          str := str + ReadXml(nodeList[i]);               {这是最关键的递归调用}
          str := str + '</' + strName + '>' + sLineBreak;  {封口}
        end;
      end;
    
      str := str + '</' + node.NodeName + '>'; {封口}
    
      Result := str;
    end;
    
    
    //调用测试(1):
    procedure TForm1.Button1Click(Sender: TObject);
    var
      str,s1,s2: string;
    begin
      XMLDocument1.LoadFromFile('c:\temp\test.xml');
      {必须用万一提供的 xml 测试文件, 才能有相同的返回值}
    
    
      {读取文件头}
      s1 := AnsiQuotedStr(XMLDocument1.Version, '"');  {读出版本, 并添加双引号}
      s2 := AnsiQuotedStr(XMLDocument1.Encoding, '"'); {读出字符集, 并添加双引号}
      str := Format('<?xml version=%s encoding=%s?>',[s1,s2]); {这就是文件头了}
    
      str := str + sLineBreak + ReadXml(XMLDocument1.DocumentElement);
    
      ShowMessage(str); {返回 xml 包含问头在内的所有内容}
    end;
    
    
    //调用测试(2)
    procedure TForm1.Button2Click(Sender: TObject);
    var
      str: string;
      node: IXMLNode;
    begin
      XMLDocument1.LoadFromFile('c:\temp\test.xml');
    
      node := XMLDocument1.DocumentElement.ChildNodes[0];
    
      str := ReadXml(node);
    
      ShowMessage(str); {返回返回根节点下第一个子节点的所有内容}
    end;
    
    end.
    
  • 相关阅读:
    网上搜索整理的前端开发工程师面试题附答案
    Python-RabbitMQ-topic(细致消息过滤的广播模式)
    Python-RabbitMQ-direct(广播模式)
    Python-RabbitMQ-fanout(广播模式)
    rabbitmq中关于exchange模式type报错
    Python-RabbitMQ(持久化)
    Python-RabbitMQ(简单发送模型)
    python-gevent模块实现socket大并发
    python-gevent模块(自动切换io的协程)
    python-greenlet模块(协程)
  • 原文地址:https://www.cnblogs.com/del/p/1025133.html
Copyright © 2011-2022 走看看