• XML简单操作


    uses
      XMLDoc, XMLIntf;


    function TAServerTbl.Init(szSerPath: string): Boolean;
    var
      pData: PServer;
      XMLServer: TXMLDocument;
      NodeList1, NodeList2: IXMLNodeList;
      Node1, Node2: IXMLNode;
      ServerUrl: TStringList;
      i, j, nLen: Integer;
      szTemp: AnsiString;
    begin
      Clear;
      try
        XMLServer := TXMLDocument.Create(Application);
        if (not FileExists(szSerPath)) then begin
          ServerUrl := TStringList.Create();
          ServerUrl.LoadFromFile(szIniPath);
          //
    从网上的地址载入,还可以从流中载入
          XMLServer.LoadFromFile(ServerUrl.Values['ServerUrl']);
          //
    保存为文件
          XMLServer.savetofile(szSerPath);
          ServerUrl.Free();
        end else begin
          //
    直接从文件载入
          XMLServer.LoadFromFile(szSerPath);
        end;
        //
    得到结列表
        NodeList1 := XMLServer.DocumentElement.ChildNodes;
        //
    循环读每个结列表
        for i := 0 to NodeList1.Count - 1 do begin
          NodeList2 := NodeList1[i].ChildNodes;
          for j := 0 to NodeList2.Count - 1 do begin
            New(pData);
            //
    每个结列表中的结
            Node2 := NodeList2[j];
            //
    结列表的名字  比如  华东电信 里边还有10个结节,也就是10个服务器
            pData^.m_szName := NodeList1[i].Attributes['name'];
            //
    去掉-[结节的名字,也就是服务器名
            szTemp := Node2.Attributes['name'];
            nLen := Pos('-', szTemp);
            if (nLen > 0) then begin
              pData^.m_szSerName := Copy(szTemp, 1, (nLen - 1)*2);
            end else begin
              pData^.m_szSerName := szTemp;
            end;
            //
    读各个节
            pData^.m_szIp := HostToIP(Node2.Attributes['ip']);
            pData^.m_nPort := StrToInt(Node2.Attributes['port']);
            pData^.m_szVer := ResolveVer(Node2.Attributes['version']);
            pData^.m_bState := StrToBool(Node2.Attributes['state']);
            FList.AddObject(pData^.m_szSerName, TObject(pData));
          end;
        end;
        XMLServer.Free();
        Result := True;
      except
        On e: Exception do
        begin
          Result := False;
        end;
      end;
    end;

     

    <?xml version="1.0" encoding="gb2312" ?>

    <root>
    <group name="华南电信" groupid="101">
      <server name="王者大陆-[新]" ip="121.9.239.189" port="9016" version="3.00.105" state="3" pip="121.9.239.224" pport="9394" serverid="10109" serverlevel="0" tip="" />
      <server name="众神之域-[新]" ip="121.9.239.225" port="9016" version="3.00.105" state="1" pip="121.9.239.224" pport="9394" serverid="10110" serverlevel="0" tip="" />
      <server name="天空之城-[新]" ip="121.9.239.213" port="9016" version="3.00.105" state="2" pip="121.9.239.224" pport="9394" serverid="10108" serverlevel="0" tip="" /></group>
     
    <group name="华东电信" groupid="105">
      <server name="皓月峡谷-[新]" ip="61.147.90.91" port="9016" version="3.00.105" state="2" pip="61.147.90.118" pport="9394" serverid="10505" serverlevel="0" tip="" />
      <server name="极北天穹-[新]" ip="61.147.90.75" port="9016" version="3.00.105" state="1" pip="61.147.90.118" pport="9394" serverid="10504" serverlevel="0" tip="" />
      </group>
    </root>
  • 相关阅读:
    详解Twitter开源分布式自增ID算法snowflake(附演算验证过程)
    分布式自增ID算法-Snowflake详解
    关于分布式唯一ID,snowflake的一些思考及改进(完美解决时钟回拨问题)
    分布式ID增强篇--优化时钟回拨问题
    专题:性能调优之工具---perf
    Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,消息队列有什么优点和缺点
    Zookeeper框架Curator使用
    Zookeeper 3.5启动时 8080端口被占用
    Qt状态机框架(状态机就开始异步的运行了,也就是说,它成为了我们应用程序事件循环的一部分了)
    Qt插件开发入门(两种方法:High-Level API接口,Low-Level API接口)
  • 原文地址:https://www.cnblogs.com/w413133157/p/2182833.html
Copyright © 2020-2023  润新知