<考核表 Ver="1">
    <年级>
        <班级 班号= "0" 名字= "陈老师" />
        <班级 班号= "1" 名字= "黄老师" />
    </年级>
    <学校>
        <班级 班号="0" 名字="陈老师" 年龄="33" 性别="男">
            <学生 名字="张三" 年龄="13" 性别="男">
            <学生 名字="李四" 年龄="13" 性别="男">
            <成绩 语文="88" 数学="89" 英语="95">
            <成绩 语文="93" 数学="82" 英语="85">
        </班级>
        <班级 班号="1" 名字="黄老师" 年龄="38" 性别="女">
            <学生 名字="小娟" 年龄="13" 性别="女">
            <学生 名字="小芬" 年龄="13" 性别="女">
            <成绩 语文="98" 数学="95" 英语="100">
            <成绩 语文="93" 数学="92" 英语="98">
        </班级>
    </学校>
</考核表>我想要读取 考核表-学校-班级-名字 (得出'陈老师')再读取下一条考核表-学校-班级-名字 (得出'黄老师')考核表-学校-班级-学生-名字 (得出‘张三’)再读取下一条考核表-学校-班级-学生-名字 (得出‘李四’)

解决方案 »

  1.   

    这是标准兼且基本的 XML 了,找个现成例子看看就好了
      

  2.   

    最万能的方法
    通过关键字截取。
    比如"<考核表","</考核表>" 
    得到的字符串,继续找关键字再截取。
    待会发几个常用的截取函数给你哈
      

  3.   

    (*
    #========================================================== 
    #功能:     返回两个字符串之间的字串 
    #参数:     cStringStr     要截取的字符串 
    #               StartStr         起始的字符串 
    #               EndStr             截止的字符串 
    #返回:     字符型               截取后的字符串 
    #========================================================== 
    *) 
    function SubStr(cStringStr, StartStr, EndStr: string): string;
    var
      iStart, iEnd: Longint;
    begin 
      //iStart := pos(StartStr, cStringStr);
      iStart := RightPos(StartStr, cStringStr);  //返回指明字串StartStr在字串cStringStr中的iStartPosz之后的位置
      if iStart = 0 then
      begin
        SubStr := ' ';
        Exit;
      end;  //返回指明字串EndStr在字串cStringStr中的位置     
      iEnd := Pos(EndStr, cStringStr);  if iEnd = iStart then
      begin 
        SubStr := ' ';
        Exit; 
      end;   //截取字串 
      if iEnd = 0 then
      begin 
        SubStr := ' ';
        exit;
      end 
      else
        SubStr := MidBStr(cStringStr, iStart + length(StartStr), iEnd - iStart - Length(StartStr)); end;(*
    #========================================================== 
    #功能:     返回两个字符串之间的字串 
    #参数:     cStringStr     要截取的字符串 
    #               StartStr         起始的字符串
    #               EndStr             截止的字符串
    #返回:     字符型               截取后的字符串 (截取最右边EndStr,EndStr左边最近的StartStr,中间部分)
    #========================================================== 
    *)
    function SubStrExR(cStringStr, StartStr, EndStr: string): string;
    var
      iStart, iEnd: Longint;
      TemStr:string;
    begin
      //返回指明字串EndStr在字串cStringStr中的位置    
      iEnd := Pos(EndStr, cStringStr);  TemStr := Copy(cStringStr,1,iEnd);  //iStart := pos(StartStr, cStringStr);
      iStart := RightPos(StartStr, TemStr);  //返回指明字串StartStr在字串cStringStr中的iStartPosz之后的位置
      if iStart = 0 then
      begin
        SubStrExR := ' ';
        Exit;
      end;  if iEnd = iStart then
      begin 
        SubStrExR := ' ';
        Exit; 
      end;   //截取字串 
      if iEnd = 0 then
      begin 
        SubStrExR := ' ';
        exit;
      end 
      else 
        SubStrExR := MidBStr(cStringStr, iStart + length(StartStr), iEnd - iStart - Length(StartStr));
       
    end;(*
    #========================================================== 
    #功能:     返回两个字符串之间的字串 
    #参数:     cStringStr     要截取的字符串 
    #               StartStr         起始的字符串
    #               EndStr             截止的字符串
    #返回:     字符型               截取后的字符串 (截取最左边StartStr,StartStr右边最近的EndStr,中间部分)
    #==========================================================
    *)
    function SubStrExL(cStringStr, StartStr, EndStr: string): string;
    var
      iStart, iEnd: Longint;
      TemStr:string;
    begin
       iStart := pos(StartStr, cStringStr);  TemStr := copy(cStringStr,iStart+length(StartStr)+1,length(cStringStr)-(iStart+length(StartStr)));  //返回指明字串EndStr在字串cStringStr中的位置
      iEnd := iStart+length(StartStr) + Pos(EndStr, TemStr);
      //返回指明字串StartStr在字串cStringStr中的iStartPosz之后的位置
      if iStart = 0 then
      begin
        SubStrExL := ' ';
        Exit;
      end;  if iEnd = iStart then
      begin 
        SubStrExL := ' ';
        Exit; 
      end;  //截取字串 
      if iEnd = 0 then
      begin 
        SubStrExL := ' ';
        exit;
      end 
      else 
        SubStrExL := MidBStr(cStringStr, iStart + length(StartStr), iEnd - iStart - Length(StartStr));
       
    end;
      

  4.   


    (*
    #========================================================== 
    #功能:     返回两个字符串之间的字串 
    #参数:     cStringStr     要截取的字符串 
    #               StartStr         起始的字符串 
    #               EndStr             截止的字符串 
    #返回:     字符型               截取后的字符串 
    #========================================================== 
    *) 
    function SubStr(cStringStr, StartStr, EndStr: string): string;
    var
      iStart, iEnd: Longint;
    begin 
      //iStart := pos(StartStr, cStringStr);
      iStart := RightPos(StartStr, cStringStr);  //返回指明字串StartStr在字串cStringStr中的iStartPosz之后的位置
      if iStart = 0 then
      begin
        SubStr := ' ';
        Exit;
      end;  //返回指明字串EndStr在字串cStringStr中的位置     
      iEnd := Pos(EndStr, cStringStr);  if iEnd = iStart then
      begin 
        SubStr := ' ';
        Exit; 
      end;   //截取字串 
      if iEnd = 0 then
      begin 
        SubStr := ' ';
        exit;
      end 
      else
        SubStr := MidBStr(cStringStr, iStart + length(StartStr), iEnd - iStart - Length(StartStr)); end;(*
    #========================================================== 
    #功能:     返回两个字符串之间的字串 
    #参数:     cStringStr     要截取的字符串 
    #               StartStr         起始的字符串
    #               EndStr             截止的字符串
    #返回:     字符型               截取后的字符串 (截取最右边EndStr,EndStr左边最近的StartStr,中间部分)
    #========================================================== 
    *)
    function SubStrExR(cStringStr, StartStr, EndStr: string): string;
    var
      iStart, iEnd: Longint;
      TemStr:string;
    begin
      //返回指明字串EndStr在字串cStringStr中的位置    
      iEnd := Pos(EndStr, cStringStr);  TemStr := Copy(cStringStr,1,iEnd);  //iStart := pos(StartStr, cStringStr);
      iStart := RightPos(StartStr, TemStr);  //返回指明字串StartStr在字串cStringStr中的iStartPosz之后的位置
      if iStart = 0 then
      begin
        SubStrExR := ' ';
        Exit;
      end;  if iEnd = iStart then
      begin 
        SubStrExR := ' ';
        Exit; 
      end;   //截取字串 
      if iEnd = 0 then
      begin 
        SubStrExR := ' ';
        exit;
      end 
      else 
        SubStrExR := MidBStr(cStringStr, iStart + length(StartStr), iEnd - iStart - Length(StartStr));
       
    end;(*
    #========================================================== 
    #功能:     返回两个字符串之间的字串 
    #参数:     cStringStr     要截取的字符串 
    #               StartStr         起始的字符串
    #               EndStr             截止的字符串
    #返回:     字符型               截取后的字符串 (截取最左边StartStr,StartStr右边最近的EndStr,中间部分)
    #==========================================================
    *)
    function SubStrExL(cStringStr, StartStr, EndStr: string): string;
    var
      iStart, iEnd: Longint;
      TemStr:string;
    begin
       iStart := pos(StartStr, cStringStr);  TemStr := copy(cStringStr,iStart+length(StartStr)+1,length(cStringStr)-(iStart+length(StartStr)));  //返回指明字串EndStr在字串cStringStr中的位置
      iEnd := iStart+length(StartStr) + Pos(EndStr, TemStr);
      //返回指明字串StartStr在字串cStringStr中的iStartPosz之后的位置
      if iStart = 0 then
      begin
        SubStrExL := ' ';
        Exit;
      end;  if iEnd = iStart then
      begin 
        SubStrExL := ' ';
        Exit; 
      end;  //截取字串 
      if iEnd = 0 then
      begin 
        SubStrExL := ' ';
        exit;
      end 
      else 
        SubStrExL := MidBStr(cStringStr, iStart + length(StartStr), iEnd - iStart - Length(StartStr));
       
    end;
      

  5.   

    晕倒!解析这个东西需要这么复杂吗?介绍一个解析XML文件的组件给你用!
    NativeXml 这个组件不错!方便实用、开源免费,我正在使用!
    他们的官网是: 
    http://www.simdesign.nl/xml.html
      

  6.   

    还有这个,不算标准函数,用的也多。function RightPos(Substr, S: string): Integer;
    begin 
      Result := Pos(ReverseString(Substr),ReverseString(S));
      if Result > 0 then
        Result := Length(S) - Result + 1 - Length(Substr) + 1;
    end;
    Pos,copy,MidBStr,RightPos这类函数倒来倒去的
      

  7.   

    多谢分享,我也马上试试这个控件。
    已经习惯尽量只能Delphi自带的控件了,呵呵。经常用第三方控件可能会出现不可预知的问题,
    并且一套代码过来先要装一堆控件才能编译,太麻烦了,只要有一个控件失传,整套代码都可能呆掉。