delphi XMLDocument 遍历xml 很慢 怎么提高速度

chinawcs 2013-05-20 09:30:38
xml 大概5500 行 我是循环遍历每个节点 判断字符串 获取节点值的 在客户计算机 需要5s多才返回值 太慢了 我是dll 里面动态XMLDocument 创建

xml 作为资源文件 加入dll


xml文件 大小才130kb 是我写的算法问题还是 XMLDocument 本身问题
...全文
183 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
随行的太阳 2013-05-23
  • 打赏
  • 举报
回复
引用 2 楼 chinawcs 的回复:

xmldoc := TXMLDocument.Create(nil);
  //DocIntf := xmldoc;
  try
    //coinitialize(nil);
    Stream := TResourceStream.create(HINSTANCE, 'isbn', 'xml');
    try
      xmldoc.LoadFromStream(Stream, xetUTF_8);
      xmldoc.Active := True;
    finally
      Stream.Free;
      //couninitialize;

    end;

    //判断 组号   <EAN.UCC>   目前978 979



    nodeList := xmldoc.DocumentElement.childNodes[3].ChildNodes;

    for i := 0 to nodeList.Count - 1 do
    begin
      //ShowMessage(nodeList[i].ChildNodes[0].NodeValue);
      //ShowMessage(qz);

      if zh<>'' then break;
      
      if nodeList[i].ChildNodes[0].NodeValue = qz then
      begin

        nodeListN := nodeList[i].ChildNodes[2].ChildNodes;

        //ShowMessage(IntToStr(nodeListN.count));
        for j := 0 to nodeListN.count - 1 do
        begin
          Frang := nodeListN[j].ChildNodes[0].NodeValue;
          //ShowMessage(Frang);
          Fmin := StrToInt(copy(Frang, 1, pos('-', Frang) - 1));
          Fmax := StrToInt(copy(Frang, pos('-', Frang) + 1, maxint));

          if (Fzh >= Fmin) and (Fzh <= Fmax) then
          begin
            zh := copy(EANISBN, 4, strtoint(nodeListN[j].ChildNodes[1].NodeValue));
            //ShowMessage(zh);
            break;
          end;

        end;
      end;
    end;




chinawcs 2013-05-23
  • 打赏
  • 举报
回复
已经验证 不是 xml 太大的问题 我就是担心 我的代码 遍历 写的不好 有没有快速访问 遍历的方法
sololie 2013-05-22
  • 打赏
  • 举报
回复
才5000行而已,XMLDocument再怎么不济也不至于要5秒吧。 从前用.NET做个网站用过xml做微型数据库,数据一致没超过一万,再高不知道,一万以下没速度没感觉差异。 你先不要做那些字符串操作,普通遍历看看速度怎样
ysai 2013-05-21
  • 打赏
  • 举报
回复
MS的XMLDocument操作大XML文件本来就比较慢 可以试试用第三方的NativeXml 或者换成JSON格式,更轻
chinawcs 2013-05-20
  • 打赏
  • 举报
回复

xmldoc := TXMLDocument.Create(nil);
  //DocIntf := xmldoc;
  try
    //coinitialize(nil);
    Stream := TResourceStream.create(HINSTANCE, 'isbn', 'xml');
    try
      xmldoc.LoadFromStream(Stream, xetUTF_8);
      xmldoc.Active := True;
    finally
      Stream.Free;
      //couninitialize;

    end;

    //判断 组号   <EAN.UCC>   目前978 979



    nodeList := xmldoc.DocumentElement.childNodes[3].ChildNodes;

    for i := 0 to nodeList.Count - 1 do
    begin
      //ShowMessage(nodeList[i].ChildNodes[0].NodeValue);
      //ShowMessage(qz);

      if zh<>'' then break;
      
      if nodeList[i].ChildNodes[0].NodeValue = qz then
      begin

        nodeListN := nodeList[i].ChildNodes[2].ChildNodes;

        //ShowMessage(IntToStr(nodeListN.count));
        for j := 0 to nodeListN.count - 1 do
        begin
          Frang := nodeListN[j].ChildNodes[0].NodeValue;
          //ShowMessage(Frang);
          Fmin := StrToInt(copy(Frang, 1, pos('-', Frang) - 1));
          Fmax := StrToInt(copy(Frang, pos('-', Frang) + 1, maxint));

          if (Fzh >= Fmin) and (Fzh <= Fmax) then
          begin
            zh := copy(EANISBN, 4, strtoint(nodeListN[j].ChildNodes[1].NodeValue));
            //ShowMessage(zh);
            break;
          end;

        end;
      end;
    end;




sololie 2013-05-20
  • 打赏
  • 举报
回复
应该不关xml事,看看你遍历的的代码吧。另外你是在服务器上遍历然后返回结果到客户端?

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧