XML解析简单问题!着急!(100分)

  • 主题发起人 主题发起人 okgxsh
  • 开始时间 开始时间
O

okgxsh

Unregistered / Unconfirmed
GUEST, unregistred user!
<iq id='002' type='set' from='Inf@192.168.1.16' to='ok@192.168.1.16'>
<query xmlns='XXX:iq:RRRR'>
<head>Id</head>
<Batch>00101</Batch>
<totalMoney>100</totalMoney>
<body>
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZz
</body>
</query>
</iq>

如何获取body内容,当zzzzzzz的数量很大上10万的时候,解析速度如何提高???
 
var
xmldoc: IXMLDocument;
RootNode: IXMLNode;
begin
XMLDoc:=TXMLDocument.Create(nil);
try
XMLDoc.Active:=true;
XMLDoc.loadFromXML(XMLStr);//XMLStr就是你的那段xml
RootNode:=XMLDoc.DocumentElement;
Result:= RootNode.ChildNodes[0].childNode[3].Text;
finally
XMLDoc.Active:=false;
XMLDoc:=nil; //等同于 XMLDoc._Release 执行这一句后接口引用计数变成0,
//编译器自动释放实现接口的对象,
//这一句不写也没有关系,编译器会自动执行!
end;
end;
 
如果你要解析速度建议用SAX,这是delphi平台相对DOM较快的方式,java平台,.net平台现在有一种VTD_XML的技术,这是速度最好的,但是delphi平台好像支持不够!
 
to: okgxsh,楼主搞错了,解释速度快慢跟body部分的内容多少没有太大或直接关系,解释速度快慢是xml本身格式复杂度决定,如果xml本身格式复杂(表现在xsd复杂)且重复数据很多,这个时候速度才成为问题,但就你这个问题而言,不会在速度上造成瓶颈,再说了复杂且记录速非常多的也不适合使用xml来保存啊
 
顶楼上的
 
既然你的内容这么固定,最快的方法绝对是自己装载所有内容到内存,然后 Pos、Copy 啊。
 
简单的,就是:
uses StrUtils;
function GetData(const S: string): string;
var
nPos1, nPos2: Integer;
begin
Result := '';
nPos1 := PosEx('<body>', S);
if nPos1 <= 0 then
Exit;
nPos2 := PosEx('</body>', S, nPos1);
if nPos2 <= 0 then
Exit;
Result := Copy(S, nPos1 + Length('<body>'), (nPos2 - 1) - (nPos1 + Length('<body>')) + 1);
end;
随手写的,没有细测。不过这个绝对是最高效的。 ;>
 
LSUPER的方法高效,
不通用;
Xml多看看吧?delphi自带的有例子!可以用解析字符串的方法来做比如zhaokaien的方法;
 

Similar threads

I
回复
0
查看
747
import
I
I
回复
0
查看
843
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部