Delphi之通过代码示例学习XML解析

  这个程序可以用于解析任何合法的XML字符串。

首先是看一下程序的运行效果:            

  以解析这样一个XML的字符串为例:

<?xml version="1.0" encoding="UTF-8"?><BookInfo><Owner><OwnerName>张三</OwnerName><OwnerAge>1234</OwnerAge></Owner><BookMes><BookName>时间简史</BookName><ISDN>234343453534</ISDN><Writer>霍金</Writer></BookMes></BookInfo>

  首先是打开应用程序

  然后将上面所示的字符串复制到文本编辑框中,然后点击解析按钮,会出现下面的效果

  如上图所示,可以 “XML中的字段标签:XML中对应标签的值” 的格式显示解析的效果。

然后看一下代码                   

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XMLIntf, XMLDoc;

type
  TForm1 = class(TForm)
    edt1: TEdit;
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ReadXml(Node: IXMLNode; var showmess: string);
var
  NodeList: IXMLNodeList;
  strName: string;
  i: Integer;
begin
  if not Node.HasChildNodes then Exit;
  nodeList := node.ChildNodes;
  for i := 0 to nodeList.Count - 1 do
  begin
    strName := nodeList[i].NodeName;
    if nodeList[i].IsTextElement then //如果是元素
    begin
      showmess:= showmess + strName + ‘:‘ + NodeList[i].NodeValue + #13#10;
    end
    else if nodeList[i].HasChildNodes then //如果有子节点
    begin
      ReadXml(NodeList[i], showmess);
    end;
  end;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  sXML, showmess: string;
  ComInstrXML: IXMLDocument;
  mainNode: IXMLNode;
begin
   showmess:= ‘‘;
   sXML:= edt1.Text;
   sXML:= StringReplace(sXML, ‘UTF-8‘, ‘gbk‘, [rfReplaceAll]);
   try
     ComInstrXML:= LoadXMLData(sXML);
     mainNode:= ComInstrXML.DocumentElement;
     readXML(mainNode, showmess);

     ShowMessage(showmess);
   except
     on E: Exception do
     begin
       ShowMessage(E.Message);
     end;
   end;
end;

end.

  

讲解一下代码                    

0.建议这样使用XML解包

  本例中的程序,在解包之后是将标签以及对应的值显示在弹出框上,这样只是为了演示解析XML的效果。

  建议在开发中将解析好的XML节点,以节点的标签作为Key,以节点的内容作为value,插入到一个可以搜索的链表或者其他什么可以根据Key进行搜索的容器类中,然后在之后使用的时候就可以很方便的搜索到解析后的值。

1.递归解包XML

  因为XML本身就是一个递归的结构,所以解包XML,也就是其中的ReadXML 方法使用的就是递归的方法,递归结束标志是:正在解析的XML标签是一个元素,没有子节点。

2.字符编码的问题

  在 TForm1.btn1Click(Sender: TObject) 方法中,我们可以看到首先将XML字符串中的 ‘UTF-8‘ 替换为 ‘gbk‘,因为如果编码方式是UTF-8:<?xml version="1.0" encoding="UTF-8"?>,那么如果XML中存在中文,那么解析的时候会报错(如果全部为英文,那么就不会报错),如下图

  如果将UTF-8替换为gbk,,那么在解析XML的时候就不会报这样的错误。

  另外如果以不包含编码格式的XML字符串,如:<BookInfo><Owner><OwnerName>张三</OwnerName><OwnerAge>1234</OwnerAge></Owner><BookMes><BookName>时间简史</BookName><ISDN>234343453534</ISDN><Writer>霍金</Writer></BookMes></BookInfo>,没有 <?xml version="1.0" encoding="UTF-8"?>的话,此时就算有   sXML:= StringReplace(sXML, ‘UTF-8‘, ‘gbk‘, [rfReplaceAll]);   这样的替换字符编码的代码也是没有用的,也没有办法改成gbk的编码,所以仍然会报上面的异常。

  所以请注意字符编码的问题,尤其是既有中文又有英文的时候。

3.stringReplace函数的使用

  function StringReplace (const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;

rfReplaceAll:全部替换 
rfIgnoreCase:忽略大小写

例子

var
    aStr: String;
begin
    aStr := ‘This is a book, not a pen!‘;
    ShowMessage(StringReplace (aStr, ‘a‘, ‘two‘, []));//This is two book, not a pen!只替换了第一个符合的字符串
    ShowMessage(StringReplace (aStr, ‘a‘, ‘two‘, [rfReplaceAll]));//This is two book, not two pen!替换了所有符合的字符串
    aStr := ‘This is a book, not A pen!‘;
    ShowMessage(StringReplace (aStr, ‘a‘, ‘two‘, [rfReplaceAll]));//This is two book, not A pen!只替换了符合的字符串(小写a)
    ShowMessage(StringReplace (aStr, ‘a‘, ‘two‘, [rfReplaceAll, rfIgnoreCase]));//This is two book, not two pen!不管大小写替换了所有符合的字符串
end;

4.换行符

  注意代码中有这样一行代码:

showmess:= showmess + strName + ‘:‘ + NodeList[i].NodeValue + #13#10;

  其中的 #13#10 表示换行符

  
时间: 2024-10-28 13:12:17

Delphi之通过代码示例学习XML解析的相关文章

Android学习xml解析大全之SAX和DOM

  随着android的学习解析xml成为了很多朋友面临的问.想学习如何解析xml就要先了解xml是什么. XML称为可扩展标记语言(Extensible Markup Language),由标准通用标记语言(SGML:Standard Generalized Markup Language)发展而来,允许开发者自定义标签,可以实现标签和内容的有效分离. 与HTML不同,XML不再侧重于数据如何表现,而是更多的关注数据如何存储和传输.因此,XML逐渐演变成为一种跨平台的数据交换格式.通过使用XM

Python XML 解析

什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识. 它也是元标记语言,即定义了用于定义其他与特定领域有关的.语义的.结构化的标记语言的句法语言. Python 对 XML 的解析 常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同. Python 有三种方法解析 XML,S

Android学习笔记(四五):互联网通信-HttpClient、XML解析(W3C)

前几日Android发布了4.0 Icecream,昨天上网发现Begining Book中有Edition 3的版本,比对一下,还是有相当的改动,不仅仅增加了tablet的部分,对原有的章节有有一些修订,前后的调整等等.先按Edtion 2的顺序看,相同章节的看Edtion 3,然后回头看Edition 3的Chapter 24.25(E2的36).26.27.28.29.44.45.46.47几个新增章节.同时将模拟器改为Android 2.3的版本,已适应可能新增的改动. 访问Intern

IOS学习:常用第三方库(GDataXMLNode:xml解析库)

IOS学习:常用第三方库(GDataXMLNode:xml解析库) 分类: ios开发学习2013-05-30 09:45 4443人阅读 评论(0) 收藏 举报 iOSXMLGDataXMLNode 一.GDataXMLNode说明 GDataXMLNode是Google提供的用于XML数据处理的类集.该类集对libxml2--DOM处理方式进行了封装,能对较小或中等的xml文档进行读写操作且支持XPath语法. 使用方法: 1.获取GDataXMLNode.h/m文件,将GDataXMLNo

由XML解析学习工厂模式

代码段1: startupData = new StartupData(); /* 设定自定义的MyHandler给XMLReader */ StartupXMLHandler startupDataXMLHandler = new StartupXMLHandler(); startupDataXMLHandler.setData(startupData); /* 产生SAXParser对象 */            SAXParserFactory spf = SAXParserFacto

javaweb学习总结十(xml解析&lt;JAXP以及DOM方式&gt;)

一:XML解析技术 一般我们使用sun公司或者开源组织开发的工具包解析xml效率比较高. 1:jaxp解析xml,jaxp是sun公司开发的解析xml工具包 2:jaxp解析xml代码如下 a:获取document文档树对象 1 @Test 2 // 获取document对象 3 public void test1() throws Exception { 4 // 1:获取解析工厂对象 5 DocumentBuilderFactory factory = DocumentBuilderFact

通过http请求传递xml流和接收xml流的代码示例

通过http请求传递xml流和接收xml流的代码示例 //1.在servlet中post一个xml流:import java.io.OutputStreamWriter;import org.jdom.Document;import org.jdom.Document; public void doPost(HttpServletRequest request, HttpServletResponse response)    throws ServletException, IOExcepti

Struts2学习笔记一之工作原理和struts.xml解析

Struts是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分. Struts的核心是ActionSevlet,ActionSevlet的核心是struts.xml.(这个xml文件作为ActionServlet的配置文件) 一.Struts的响应过程: 1.当Tomcat收到client访问请求,比如http://localhost:8080/Struts2_01_Introduction/Hello_struts,会访问Struts2_01_In

Objective-C学习之解析XML

通过soap请求webservice时,返回的数据是XML类型,有时候也需要解析本地的xml数据等,苹果自带类NSXMLParser解析xml还是很方便的,简单轻便 本文以解析本地XML为例,网络获取到的返回值只需转换成NSData型,解析是同理 需要解析的xml文件如下,users.xml 01<?xml version="1.0" encoding="UTF-8"?>02<AllUsers>03    <message>用户信