第一篇
使用原生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;