65.9K
CodeProject 正在变化。 阅读更多。
Home

基于 DOM 的 XML 解析器,其事件触发方式与 SAX 解析器类似

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.80/5 (7投票s)

2004年10月8日

3分钟阅读

viewsIcon

51893

downloadIcon

1652

一个简单的 ActiveX 控件,用于解析 XML 文档,并在 XML 文档中遇到元素(根、节点、叶、主体)时触发事件。

Sample Image - XML_Parser_Ctrl.gif

引言

对于新手来说,解析 XML 文档一直是一个挑战,特别是如果你没有遍历树的概念。这个解析器封装了 MSXML,并且基于 DOM 方式解析 XML(即,维护 XML 文档的树)。

我的解析器的显著特征是,虽然它基于 DOM,但一旦树被维护,它就会遍历树,并以基于 SAX 的解析器遇到元素时相同的方式触发事件。

操作 (Operation)

操作非常简单。我首先将整个 XML 加载到 IXMLDOMDocument 对象中,然后使用深度优先算法从根节点开始遍历树(感谢我的老师沙哈布先生以这种有效的方式教我数据结构)。

特点

此控件在运行时是不可见的,并公开了两种方法和三个事件。

方法有

  • BOOL LoadXMLFromFile();
  • BOOL ParseXML(LPCTSTR XPathString, LPCTSTR strXML);

事件如下:

  • void FoundRootElement(BSTR ElementName, BSTR AttributesList);
  • void FoundChildNode(BSTR strNodeName, BSTR strNodeAttributes, BSTR strParentNodeName);
  • void FoundLeaf(BSTR strLeafName, BSTR strLeafAttrib, BSTR strBodyValue, BSTR strParentNode);

如果节点具有属性,它将作为“;”分隔的 name=value 对传递给容器应用程序。

在使用控件之前

在使用控件之前,不要忘记首先在您的系统上注册它。为此,请按照以下步骤操作。

1. 下载 XML 解析器控件 - 17.4 KB 并将其解压到任何文件夹,例如 c:\XML_Parser_Ctrl_src

2. 在命令提示符下输入以下内容 regsvr32 c:\XML_Parser_Demo.ocx 并按 Enter 键。 这将在您的系统上注册控件

步骤

在您的项目中插入控件

  1. 使用 regsvr32 命令注册控件,并将 XML_Parser_Demo.ocx 路径作为参数。(例如:regsvr32 c:\XML_Parser_Demo.ocx)
  2. 使用类向导创建一个 MFC 应用程序(选择“基于对话框”作为应用程序类型)。
  3. 转到“项目 > 添加到项目”菜单,然后单击“组件和控件…”子菜单。
  4. 在出现的“组件和控件库”对话框中,双击“已注册的 ActiveX 控件 > XML_Parser_Demo 控件”。单击所有后续消息的确定,然后关闭对话框。
  5. 在资源视图中打开您的对话框(如果尚未打开),您可以在控件工具栏中看到 XML_Parser_Demo 控件的图标(写着“XML”)。单击此图标,将其拖到您的对话框上,然后将其放置在那里。

使用控件

  1. 使用类向导为 XML_Parser_Demo 控件附加一个成员变量(例如 m_XMLCtrl)。
  2. 按 Ctrl+W 键,在出现的类向导对话框的“消息映射”选项卡上,从“对象 ID”列表中选择 IDCXMLPARSERDEMOCTRL1,然后通过双击每个事件并接受默认名称来添加 FoundRootElement、FoundChildNode 和 FoundLeaf 事件的事件处理程序。
  3. 如果您想解析保存在磁盘上的 XML 文档,请调用 m_XMLCtrl.LoadXMLFromFile(); 这将加载您的 XML 文档,将从根节点开始解析它,并在遇到根、节点和叶时分别触发 FoundRootElement、FoundChildNode 和 FoundLeaf 等事件,从而调用 OnFoundRootElementXmlparserdemoctrl1、OnFoundChildNodeXmlparserdemoctrl1、OnFoundLeafXmlparserdemoctrl1。
  4. 或者,如果您想解析 XML 字符串,则调用 m_XMLCtrl.ParseXML(…) 传递要从哪里开始解析的节点名称,前面加上“//”,以及 XML 字符串作为参数。

例如,要解析以下 XML 字符串

CString strXML = "
<catalog name="My Catalog" id="146">
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications 
with XML.</description>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies, 
an evil sorceress, and her own childhood to become queen 
of the world.</description>
</book>
</catalog>";

call

m_XMLCtrl.ParseXML("//book",strXML);

或者只解析第一个 <book> 元素调用

m_XMLCtrl.ParseXML("//book[1]",strXML); 

或者解析整个 XML 字符串调用

m_XMLCtrl.ParseXML("//catalog",strXML);
  1. 编译并运行程序。

Sample screenshot

最后,我想把这个项目献给我的一个非常特别和杰出的朋友,他曾经问我要这种类型的 XML 解析器。

© . All rights reserved.