在 Kenn Scribner 近期有关 XML和MSXML DOM 分析器的文章中,仅介绍了该分析器的部 分功能。这些文章将XML 作为一种技术进行了说明,但是并没有介绍 XML 分析器本身。现在 ,Kenn 将回过头来介绍 MSXML 分析器,并讲解处理 XML 文档和节点所需的基本知识:搜索 特定的节点、插入节点和检索节点值。
MSXML 分析器基于 XML 文档对象模型,对于查看表 1 中所示的各种文档对象来说,它非 常重要。这些对象直接出自 XML 规范本身。MSXML 还可以进一步将XML DOM 对象合并到 COM 中。因此,弄清楚哪个 XML DOM 对象对应于哪个 MSXML COM 接口非常容易。例如, IXMLDOMNode 代表称为 Node 的DOM 对象。
表 1. XML DOM 对象及其用途 | |
DOM 对象 | 用途 |
DOMImplementation | 一个查询对象,用于确定 DOM 支持的级别 |
DocumentFragment | 表示树的一部分(可进行剪切/粘贴操作) |
Document | 表示树中的顶级节点 |
NodeList | 用于访问 XML 节点的Iterator 对象 |
Node | 用于扩展带核心 XML 标记的元素 |
NamedNodeMap | 命名空间支持和迭代通过属性节点集合 |
CharacterData | 文本操作对象 |
Attr | 表示元素的属性 |
Element | 表示 XML 元素的节点(可用于访问属性) |
Text | 表示给定元素或属性对象的文本内容 |
CDATASection | 用于屏蔽 XML 部分,使其不受分析和验证 |
Notation | 包含基于 DTD 或架构内的表示法 |
Entity | 表示已分析或未分析的实体 |
EntityReference | 表示实体引用节点 |
ProcessingInstruction | 表示处理指令 |
虽然有时比较容易混淆,但是 XML 文档对象可以是(并且通常是)多态的。即,“ 节点”同时也是一个“元素”。当您试图确定需要何种 DOM 对象来执行何 种操作时,这有时会造成混淆。可以使用“文档”对象来创建 DOM“节点 ”,但是,如果要向新创建的节点添加属性,就必须通过其作为“元素”的 一面来访问它。如果说存在一种将对象和操作关联在一起的神奇模式,那么我还没能从自己 的日常工作中将它提炼出来。我发现自己仍需要不断参考 MSDN 文档来查看哪个 COM 接口提 供了所需的方法以执行我试图完成的任务。各种对象方法看上去的确是按逻辑分组的,这也 正是我对 DOM 当初的开发模式的推断(通过分组逻辑操作)。
因此,其中的诀窍就在于从 MSXML 分析器检索适当的DOM 对象,这一操作的具体实现就 是 COM 对象。操作的基本模式将是:首先实例化 MSXML COM 对象本身的一个副本,然后从 该副本请求或以其他方式获取指向附加 XML DOM 对象(本身也是 COM 对象)的指针。
MSXML DOM 试验应用程序
创建一个漂亮的应用程序,演示众多的MSXML 功能,这很简单,但实际上,附加的代码只 会画蛇添足。相反,我选择了开发一个简单的基于控制台的应用程序,该应用程序执行四种 基本操作:
• | 从磁盘加载一个 XML 文件。 |
• | 搜索特定的节点,并向该节点插入一个子节点。 |
• | 搜索另一个节点,并显示该节点内包含的(文本)值。 |
• | 将修改后的XML 文档保存回磁盘中。 |