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.

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

  • 相关阅读:
    LeetCode-求最长回文子序列
    C++四种类型转换总结
    kmp算法分析和C++实现
    把二叉树打印成多行
    考研数据结构笔记—堆排序
    天勤考研数据结构笔记—栈的C语言实现
    合并两个排序的链表递归和非递归C++实现
    二叉树的线索化
    单链表的基本操作实现
    OpenFaceswap 入门教程(3): 软件参数篇!
  • 原文地址:https://www.cnblogs.com/huangcong/p/1809952.html
Copyright © 2011-2022 走看看