没用过XMLDocument,但是可以将这个XML读入到流中,然后定义两个指针来根据<和>来遍历该流。比较‘xh’这样的名字取出后续值。 你这里的<item id="0"> 如果要取ID的值, 可能要特殊处理下。大致如下: procedure TForm1.btn1Click(Sender: TObject); function SetXMLFormatStr(const AStr: string): string; begin Result := ''; Result := '<' + AStr + '>'; end; var tmpFilePath: string; tmpfilestream: TFileStream; tmpFileMemoryStream: TMemoryStream; buffer: array of char; p: PChar; pFlag, p0: PChar; tmpOffset: longword; tmpStr, tmpFieldNameStr, tmpvalue: string; tmpValueStr: array of string; tmpFileSize: Cardinal; tmpLen: Cardinal; I,J: Integer; begin opendlg.Filter := 'xml文件|*.XML'; if opendlg.Execute then begin tmpFilePath := opendlg.FileName; end; Edit1.Text := tmpFilePath;
tmpfilestream := TFileStream.Create(tmpFilePath, fmOpenRead or fmShareExclusive); try //获得filestream的大小 //指针指向该stream, //按照格式循环取对应值; //赋值给array of string 数组; tmpfilestream.Position := 0; tmpFileSize := tmpFileStream.Size; SetLength(buffer, tmpFileSize); tmpFileStream.Read(buffer[0], tmpFileSize); finally FreeAndNil(tmpfilestream); end; mmo1.Lines.Add(PChar(buffer)); try p := PChar(buffer); p0 := PChar(buffer); while (p - p0) < tmpFileSize do begin while p^ in [#0..#32] do p := CharNext(p); //读文件头 //读root部分 //读item部分 //每个<item>之间存着数字部分 (循环读入) //进入实际的数值部分,进行""的提取; //读root部分 //读item部分 //读文件尾 if p^ = '<' then //如果是<item> ,那么就要取之间的内容; begin pFlag := p; //记住这个位置,找对应的> while p^ <> '>' do p := charnext(p); if p^ = '>' then begin //获得 filedname; SetString(tmpFieldNameStr, pFlag,p - pFlag + 1); mmo2.lines.add(tmpFieldNameStr); for I := 0 to Length(cNodeFileNameArr) -1 do begin if tmpFieldNameStr = SetXMLFormatStr(cNodeFileNameArr[I]) then begin p := charnext(p); pFlag := p; while p^ <> '<' do p := charnext(p); if p^ = '<' then begin SetString(tmpvalue, pFlag,p - pFlag); mmo2.lines.add(tmpvalue); //打印值; end; Break; end; end; end; p := charnext(p); end; p := charnext(p); end; finally FreeAndNil(tmpfilestream); end; end;
cNodeFileNameArr: array[0..5] of string = ('syxz','syr','zzl','glbm','xh','sfyx');
childnodes取子节点列表
nodes[节点名]取子节点
procedure TForm1.btn1Click(Sender: TObject);
function SetXMLFormatStr(const AStr: string): string;
begin
Result := '';
Result := '<' + AStr + '>';
end;
var
tmpFilePath: string;
tmpfilestream: TFileStream;
tmpFileMemoryStream: TMemoryStream;
buffer: array of char;
p: PChar;
pFlag, p0: PChar;
tmpOffset: longword;
tmpStr, tmpFieldNameStr, tmpvalue: string;
tmpValueStr: array of string;
tmpFileSize: Cardinal;
tmpLen: Cardinal;
I,J: Integer;
begin
opendlg.Filter := 'xml文件|*.XML';
if opendlg.Execute then
begin
tmpFilePath := opendlg.FileName;
end;
Edit1.Text := tmpFilePath;
tmpfilestream := TFileStream.Create(tmpFilePath, fmOpenRead or fmShareExclusive);
try
//获得filestream的大小
//指针指向该stream,
//按照格式循环取对应值;
//赋值给array of string 数组;
tmpfilestream.Position := 0;
tmpFileSize := tmpFileStream.Size;
SetLength(buffer, tmpFileSize);
tmpFileStream.Read(buffer[0], tmpFileSize);
finally
FreeAndNil(tmpfilestream);
end;
mmo1.Lines.Add(PChar(buffer)); try p := PChar(buffer);
p0 := PChar(buffer); while (p - p0) < tmpFileSize do
begin
while p^ in [#0..#32] do
p := CharNext(p);
//读文件头
//读root部分
//读item部分 //每个<item>之间存着数字部分 (循环读入)
//进入实际的数值部分,进行""的提取;
//读root部分
//读item部分
//读文件尾
if p^ = '<' then //如果是<item> ,那么就要取之间的内容;
begin
pFlag := p; //记住这个位置,找对应的> while p^ <> '>' do
p := charnext(p); if p^ = '>' then
begin
//获得 filedname;
SetString(tmpFieldNameStr, pFlag,p - pFlag + 1);
mmo2.lines.add(tmpFieldNameStr);
for I := 0 to Length(cNodeFileNameArr) -1 do
begin
if tmpFieldNameStr = SetXMLFormatStr(cNodeFileNameArr[I]) then
begin
p := charnext(p);
pFlag := p;
while p^ <> '<' do
p := charnext(p);
if p^ = '<' then
begin
SetString(tmpvalue, pFlag,p - pFlag);
mmo2.lines.add(tmpvalue); //打印值;
end;
Break;
end;
end;
end; p := charnext(p); end; p := charnext(p); end; finally
FreeAndNil(tmpfilestream);
end;
end;