• 黄聪: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.

    出处:http://www.cnblogs.com/del/archive/2008/01/03/1025133.html

  • 相关阅读:
    Java的审计项目导入---基于现有的微服务项目上再加个xmsj
    vo中对date格式的时间格式的处理,方便到前台展示
    Java的Maven项目的导入
    [2020-05]测试短信发送记录
    那些年总是记不住的前端写法!
    【HTML+CSS】比较清淡的一个表格。
    C# 里这么写 busiDate.replace('-', ' ').trim(),可以把2020-04-01转为 20200401;java里这么些只能转为2020 04 01……
    radType条件没有用?
    我的程序里面出现了下面的警告:Unreachable code请问是什么原因?该怎么解决呢?
    ubuntu18.04安装Charles及问题
  • 原文地址:https://www.cnblogs.com/huangcong/p/1809952.html
Copyright © 2020-2023  润新知