kbmmw 中XML 操做入門(跨平臺,並且能夠與JSON,YAML,BSON 直接互相轉換)

      delphi 很早之前就自帶了xml 的操做,最新版裏面有三種XML 解釋器,一種是MSXML,看名字就知道html

這個是微軟自帶的,這個據delphi 官方稱是速度是最快的,可是隻能在windows 上使用。另外兩個是node

OmniXML ADOM, 這兩個都是跨平臺的。可是速度比MSXML 慢點。在delphi 10.2 裏面,WINDOWS
linux

應用默認使用MSXML, linux 應用默認使用OmniXML。 固然也能夠經過強行改變windows

 

    今天咱們講一下如何使用kbmmw 內置的XML 解釋器處理XML . 爲何要使用kbmmw 的XML 解釋器呢,dom

主要緣由是跨平臺,同時做者號稱其速度很快(我沒有作具體的比較),最重要的是它能夠與JSON,YAML,BSONgoogle

直接互相轉換。spa

    首先,在kbmmw 的XML 裏面,主要有兩個對象,一個是TkbmMWDOMXML,他表明着整個XML 對象,另外code

一個就是TkbmMWDOMXMLNode,它表明XML 中的節點。orm

 咱們建一個最簡單的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;
複製代碼

運行結果如圖:

基本上就是這樣了。

 

http://www.cnblogs.com/xalion/p/7225682.html

相關文章
相關標籤/搜索