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






2.80/5 (7投票s)
2004年10月8日
3分钟阅读

51893

1652
一个简单的 ActiveX 控件,用于解析 XML 文档,并在 XML 文档中遇到元素(根、节点、叶、主体)时触发事件。
引言
对于新手来说,解析 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 键。 这将在您的系统上注册控件
步骤
在您的项目中插入控件
- 使用 regsvr32 命令注册控件,并将 XML_Parser_Demo.ocx 路径作为参数。(例如:regsvr32 c:\XML_Parser_Demo.ocx)
- 使用类向导创建一个 MFC 应用程序(选择“基于对话框”作为应用程序类型)。
- 转到“项目 > 添加到项目”菜单,然后单击“组件和控件…”子菜单。
- 在出现的“组件和控件库”对话框中,双击“已注册的 ActiveX 控件 > XML_Parser_Demo 控件”。单击所有后续消息的确定,然后关闭对话框。
- 在资源视图中打开您的对话框(如果尚未打开),您可以在控件工具栏中看到 XML_Parser_Demo 控件的图标(写着“XML”)。单击此图标,将其拖到您的对话框上,然后将其放置在那里。
使用控件
- 使用类向导为 XML_Parser_Demo 控件附加一个成员变量(例如 m_XMLCtrl)。
- 按 Ctrl+W 键,在出现的类向导对话框的“消息映射”选项卡上,从“对象 ID”列表中选择 IDCXMLPARSERDEMOCTRL1,然后通过双击每个事件并接受默认名称来添加 FoundRootElement、FoundChildNode 和 FoundLeaf 事件的事件处理程序。
- 如果您想解析保存在磁盘上的 XML 文档,请调用 m_XMLCtrl.LoadXMLFromFile(); 这将加载您的 XML 文档,将从根节点开始解析它,并在遇到根、节点和叶时分别触发 FoundRootElement、FoundChildNode 和 FoundLeaf 等事件,从而调用 OnFoundRootElementXmlparserdemoctrl1、OnFoundChildNodeXmlparserdemoctrl1、OnFoundLeafXmlparserdemoctrl1。
- 或者,如果您想解析 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);
- 编译并运行程序。
最后,我想把这个项目献给我的一个非常特别和杰出的朋友,他曾经问我要这种类型的 XML 解析器。