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;
运行结果如图:
基本上就是这样了。