zoukankan      html  css  js  c++  java
  • kbmmw 中XML 操作入门

          delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道

    这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使用。另外两个是

    OmniXML ADOM, 这两个都是跨平台的。但是速度比MSXML 慢点。在delphi 10.2 里面,WINDOWS

    应用默认使用MSXML, linux 应用默认使用OmniXML。 当然也可以通过强行改变

        今天我们讲一下如何使用kbmmw 内置的XML 解释器处理XML . 为什么要使用kbmmw 的XML 解释器呢,

    主要原因是跨平台,同时作者号称其速度很快(我没有做具体的比较),最重要的是它可以与JSON,YAML,BSON

    直接互相转换。

        首先,在kbmmw 的XML 里面,主要有两个对象,一个是TkbmMWDOMXML,他代表着整个XML 对象,另外

    一个就是TkbmMWDOMXMLNode,它代表XML 中的节点。

     我们建一个最简单的XML 对象。

    procedure TForm2.Button1Click(Sender: TObject);
    var
       dom:TkbmMWDOMXML;
       node:TkbmMWDOMXMLNode;
    begin
      memo1.Lines.Clear;
       dom:=TkbmMWDOMXML.Create;
            try
            dom.PreserveWhiteSpace:=true;
            dom.AutoLineFeed:=true;
    
            node:=TkbmMWDOMXMLNode.Create(dom);
            node.Name:='xml';
            node.IsDeclaration:=true;
            node.AttribByName['version']:='1.0';
            node.AttribByName['encoding']:='UTF-8';
            node.AttribByName['standalone']:='no';
    
    
            dom.Root.Nodes.AddNode(node);
            memo1.Lines.Add(dom.SaveToString(nil));
          finally
          dom.Free;
          end;
    
    end;

    运行结果如下:

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>

    我们可以继续加入一个节点。

    procedure TForm2.Button1Click(Sender: TObject);
    var
      
       dom:TkbmMWDOMXML;
       node:TkbmMWDOMXMLNode;
    begin
      memo1.Lines.Clear;
       dom:=TkbmMWDOMXML.Create;
            try
            dom.PreserveWhiteSpace:=true;
            dom.AutoLineFeed:=true;
    
            node:=TkbmMWDOMXMLNode.Create(dom);
            node.Name:='xml';
            node.IsDeclaration:=true;
            node.AttribByName['version']:='1.0';
            node.AttribByName['encoding']:='UTF-8';
            node.AttribByName['standalone']:='no';
            dom.Root.Nodes.AddNode(node);
    
            node:=TkbmMWDOMXMLNode.Create(dom);
            node.Name:='creator';
            node.Data:='xalion';
            dom.root.Nodes.AddNode(node);
    
    
    
            memo1.Lines.Add(dom.SaveToString(nil));
          finally
          dom.Free;
          end;
    
    end;

    运行结果如下:

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    <creator>xalion</creator>

    继续插入一组数据

    procedure TForm2.Button1Click(Sender: TObject);
    var
       dom:TkbmMWDOMXML;
       node,datanode,rownode:TkbmMWDOMXMLNode;
      i: Integer;
    begin
      memo1.Lines.Clear;
       dom:=TkbmMWDOMXML.Create;
            try
            dom.PreserveWhiteSpace:=true;
            dom.AutoLineFeed:=true;
    
            node:=TkbmMWDOMXMLNode.Create(dom);
            node.Name:='xml';
            node.IsDeclaration:=true;
            node.AttribByName['version']:='1.0';
            node.AttribByName['encoding']:='UTF-8';
            node.AttribByName['standalone']:='no';
            dom.Root.Nodes.AddNode(node);
    
            node:=TkbmMWDOMXMLNode.Create(dom);
            node.Name:='creator';
            node.Data:='xalion';
            dom.root.Nodes.AddNode(node);
    
            datanode:=TkbmMWDOMXMLNode.Create(dom);
            datanode.Name:='result';
            dom.Root.Nodes.AddNode(datanode);
    
            for i := 1 to 10 do
              begin
    
                rownode:=TkbmMWDOMXMLNode.Create(dom);
                rownode.Name:='row';
                        node:=TkbmMWDOMXMLNode.Create(dom);
                        node.name:='id';
                        node.SetAsInt(i);
                        rownode.Nodes.AddNode(node);
                        node:=TkbmMWDOMXMLNode.Create(dom);
                        node.name:='name';
                        node.Data:='xalion';
                        rownode.Nodes.AddNode(node);
                        node:=TkbmMWDOMXMLNode.Create(dom);
                        node.name:='date';
                        node.SetAsDateTime(now);
                        rownode.Nodes.AddNode(node);
    
                datanode.Nodes.AddNode(rownode);
    
              end;
    
           memo1.Lines.Add(dom.SaveToString(nil));
          finally
          dom.Free;
          end;
    
    end;

    输出结果如下:

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    <creator>xalion</creator>
    <result>
    <row>
    <id xsd:type="int">1</id>
    <name>xalion</name>
    <date xsd:type="datetime">2017-07-24T01:37:51.761+08:00</date>
    </row>
    <row>
    <id xsd:type="int">2</id>
    <name>xalion</name>
    <date xsd:type="datetime">2017-07-24T01:37:51.761+08:00</date>
    </row>
    <row>
    <id xsd:type="int">3</id>
    <name>xalion</name>
    <date xsd:type="datetime">2017-07-24T01:37:51.761+08:00</date>
    </row>
    <row>
    <id xsd:type="int">4</id>
    <name>xalion</name>
    <date xsd:type="datetime">2017-07-24T01:37:51.761+08:00</date>
    </row>
    <row>
    <id xsd:type="int">5</id>
    <name>xalion</name>
    <date xsd:type="datetime">2017-07-24T01:37:51.761+08:00</date>
    </row>
    <row>
    <id xsd:type="int">6</id>
    <name>xalion</name>
    <date xsd:type="datetime">2017-07-24T01:37:51.761+08:00</date>
    </row>
    <row>
    <id xsd:type="int">7</id>
    <name>xalion</name>
    <date xsd:type="datetime">2017-07-24T01:37:51.761+08:00</date>
    </row>
    <row>
    <id xsd:type="int">8</id>
    <name>xalion</name>
    <date xsd:type="datetime">2017-07-24T01:37:51.761+08:00</date>
    </row>
    <row>
    <id xsd:type="int">9</id>
    <name>xalion</name>
    <date xsd:type="datetime">2017-07-24T01:37:51.761+08:00</date>
    </row>
    <row>
    <id xsd:type="int">10</id>
    <name>xalion</name>
    <date xsd:type="datetime">2017-07-24T01:37:51.761+08:00</date>
    </row>
    </result>

    上面介绍了kbmmw 中XML 的建立操作,那么如何访问这些节点呢?

    最简单的方法就是遍历,一个一个找,但是这种方法太麻烦。在kbmmw 中可以通过路径来

    访问节点。

    procedure TForm2.Button2Click(Sender: TObject);
    var
       dom:TkbmMWDOMXML;
       node,datanode,rownode:TkbmMWDOMXMLNode;
    begin
    
       memo2.Lines.Clear;
       dom:=TkbmMWDOMXML.Create;
       try
       dom.LoadFromString(memo1.Lines.Text);
    
       node:=dom.getnode('//creator');
       if node<>nil then
          memo2.Lines.Add(node.Data)
       finally
         dom.Free
       end;
    end;

    运行结果如图

    继续复杂一点的

    procedure TForm2.Button2Click(Sender: TObject);
    var
       dom:TkbmMWDOMXML;
       node,datanode,rownode:TkbmMWDOMXMLNode;
      i: Integer;
      j: Integer;
    begin
    
       memo2.Lines.Clear;
       dom:=TkbmMWDOMXML.Create;
       try
       dom.LoadFromString(memo1.Lines.Text);
    
       datanode:=dom.getnode('//result');
       if datanode<>nil then
        begin
          if datanode.Nodes.Count>0 then
            begin
             for i := 0 to datanode.Nodes.Count-1 do
                begin
                 rownode:=datanode.Nodes[i];
    
                    for j := 0 to rownode.Nodes.Count-1 do
                      begin
                       node:=rownode.Nodes[j];
                       if node<>nil then
                          memo2.Lines.Add(node.Data);
                      end;
                end;
            end;
        end;
       finally
         dom.Free
       end;
    end;

    运行结果如图:

    基本上就是这样了。

  • 相关阅读:
    vue 重定向
    vue 通过插槽分发内容
    vue 表单输入绑定 checkbox
    jq enter键发送
    vue footer点击变色
    vue computed和methods 计算属性和侦听器
    实时监听input输入情况
    关于Input输入框蓝色外框的操作
    鼠标悬浮指针变手
    鼠标悬浮样式
  • 原文地址:https://www.cnblogs.com/xalion/p/7225682.html
Copyright © 2011-2022 走看看