今天把原先codelphi的blog迁移过来了!delphi+xml

来源:互联网 发布:拉波尔特 fm 数据 编辑:程序博客网 时间:2024/06/11 22:53

第一篇

使用原生ms的xml解析器

 2004-09-02

Procedure TFormRes.btnrunClick(Sender: TObject);
Var
  SelectIntf: IDOMNodeSelect;
  listIntf: IDOMNodeList;
  pathstr, ss,ss1: String;
  n1: integer;
Begin

  Try
    res := 0;
    edtres.Text := ‘’;

    If paramstr(1) <> ‘’   Then
    Begin

      pathstr := ‘//Content’; //这儿就是XPATH查询串。
      xmlfile.LoadFromFile(paramstr(1));
      SelectIntf := xmlfile.DOMDocument As IDOMNodeSelect;
      listIntf := SelectIntf.selectNodes(pathstr);
      // ShowMessage(intToStr(  listIntf.length));
      For n1 := 0 To listIntf.length - 1 Do Begin
        If (listIntf.item[n1].childNodes[0] <> Nil) And (String(listIntf.item[n1].attributes[2].nodeValue) = ‘1′) Then Begin
          ss := listIntf.item[n1].childNodes[0].nodeValue;
          ss1:= Scanstr(ss);
          if ss1<>'’ then
          listIntf.item[n1].childNodes[0].nodeValue := ss1;
        End;
        edtres.Text := inttostr(res);
      End;
      xmlfile.SaveToFile(paramstr(1));
     showmessage(’处理完成!’);

    End
    else
      If edtfile.Text <> ‘’   Then
    Begin

      pathstr := ‘//Content’; //这儿就是XPATH查询串。
      xmlfile.LoadFromFile (edtfile.Text);

      SelectIntf := xmlfile.DOMDocument As IDOMNodeSelect;
      listIntf := SelectIntf.selectNodes(pathstr);
      // ShowMessage(intToStr(  listIntf.length));
      For n1 := 0 To listIntf.length - 1 Do Begin
        If (listIntf.item[n1].childNodes[0] <> Nil) And (String(listIntf.item[n1].attributes[2].nodeValue) = ‘1′) Then Begin
          ss := listIntf.item[n1].childNodes[0].nodeValue;
          ss1:= Scanstr(ss);
          if ss1<>'’ then
          listIntf.item[n1].childNodes[0].nodeValue := ss1;
        End;
        edtres.Text := inttostr(res);
      End;
      xmlfile.SaveToFile(edtfile.Text);
      xmlfile.Destroy;;
     showmessage(’处理完成!’);
    End;
  Finally
  End;

End;

Function TFormRes.Scanstr(str: String): String;
Const
  localfile = ’src’;

Var
  tt,kk,str1,str2: String; //str1暂存剩余部分
  pp, index, ipath: integer;
  newflag:boolean;
Begin
  //定位
   str2:='’;
  pp := pos(localfile, str);
  str1:=str;
  newflag:=false;

  While pp > 0 Do Begin
    If pp > 0 Then Begin
     if  copy(str1,pp+5,5)=’$PATH’ then
       begin
       newflag:=true;
       break;
       end;
      For index := pp +5  To length(str1) Do
        If str1[index] = ‘”‘ Then
          break;
      tt := copy(str1, pp+5 , index - pp-5);   //get filepath
      ipath := length(tt);
      if ipath>0 then
      While  (tt[ipath] <> ‘/’) and (tt[ipath] <> ‘/’) and (ipath>0) Do
        ipath := ipath - 1;
      kk := copy(tt, ipath + 1, length(tt) - ipath + 1); //get filename
      str2 := str2+copy(str1, 0, pp+4) + ‘$PATH’ + kk;
      str1:= copy(str1, index, length(str1) - index);
      res := res + 1;
    End;
    pp := pos(localfile, str1);
    if pp=0 then  str2:=str2+str1;
  End;
   if newflag then
    result:=str
    else
     result:=str2;

End;