kbmmw 中XML 操作入门

简介: delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道 这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使用。

      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;

运行结果如图:

基本上就是这样了。

 

目录
相关文章
|
3月前
|
XML C# 数据格式
使用C#操作XML文件
使用C#操作XML文件
|
3月前
|
XML Java 开发工具
jdom操作xml实战
jdom操作xml实战
|
4天前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
2月前
|
XML Java 数据格式
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)
33 1
|
2月前
|
XML Java 数据库连接
MyBatis入门——MyBatis XML配置文件(3)
MyBatis入门——MyBatis XML配置文件(3)
44 6
|
4天前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
|
4天前
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
|
4天前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
4天前
|
XML Java 数据格式
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
这篇文章详细介绍了Spring框架中IOC容器的Bean管理,特别是基于XML配置方式的实现。文章涵盖了Bean的定义、属性注入、使用set方法和构造函数注入,以及如何注入不同类型的属性,包括null值、特殊字符和外部bean。此外,还探讨了内部bean的概念及其与外部bean的比较,并提供了相应的示例代码和测试结果。
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
|
4天前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式