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

自动生成 XML 解析器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.08/5 (10投票s)

2004年6月1日

3分钟阅读

viewsIcon

108054

downloadIcon

1971

一篇关于 XML 解析器或代码自动生成相关的文章。

引言

我想你对这篇文章的第一反应会是:“哦,又一个像 MSXML 那样的 XML 解析工具”。事实上,这篇文章是基于 MSXML 的。我将向你展示的不是一个通用的 XML 解析器,而是一个用于创建特定 XML 解析器的生成器。我这篇文章的目的不是教你一些关于语法解析技术方面的知识,而是为你提供一些关于通过 XML 解析器生成器进行自动代码生成的想法。XML 解析器可能在你的编程领域中没有任何用处,但这并不重要,如果你在文章的结尾能够获得一种新鲜感,那么它也会对你未来激动人心的编程生活有所帮助。

背景

面对大量的 XML 文件,我不得不编写大量的代码来从中检索信息。即使借助 MSXML SDK 和 XPATH 技术,我也不得不说,这项工作很困难。事实上,编写以下代码会非常枯燥并且容易出错。

IXMLDOMNodePtr psNode = 
  m_pXmlDoc->selectSingleNode(_T("/rss/channel/description"));
psNode = m_pXmlDoc->selectSingleNode(_T("/rss/channel/language"));
...

下面给出了示例 XML 片段

<rss version="0.91">
 <channel>
   <description>XML.com features a rich mix of information 
       and services for the XML community.</description> 
   <language>en-us</language> 
   <item>
     <title>Normalizing XML, Part 2</title> 
   </item>
   <item>
     <title>The .NET Schema Object Model</title> 
   </item>
 </channel>
</rss>

这里的问题是,如果我需要 XML 节点的值,我必须写下每个 XPATH 来获取它。对于每种 XML 文件,都应该有一个解析器,非常简单,但是实现起来非常枯燥。

解决方案 - 自动代码生成

作为一个程序员,我既充满激情又很懒惰。我太懒得写上面枯燥代码的任何一行,但我非常热衷于想出一个方法来自动生成代码。这是我的解决方案

  • 编写一个算法来从 XML 文件生成 XPATH。
  • 编写一个模板解析器。
  • 将 XPATH 填入模板解析器。

由于 XML 文件的模式通常不在手边,因此关于如何判断 XML 节点(例如,/rss/channel/item)是否属于一个结构会有一些困难。当前的解决方案是,如果它的出现次数大于一次,则将其视为结构,否则视为单个节点。

由于我的语言是 C++,所以在每个解析器中,结构节点的值都被放入 STL 向量中,而单个节点的值则通过定义的枚举类型检索。解析器的编程语言并不重要,你可以修改生成器以生成 VB/Java/C# 中的解析器,随便你喜欢 :-)

关注点

正如我从一开始所说的那样,我向你展示的不仅仅是代码,更重要的是,它是一个想法(自动代码生成),可以节省你的精力,让我们的编程生活更轻松、更精彩。所以,如果你有相同的经历(不限于 XML 领域),请随时与我联系,我很乐意提供我的建议。正如谚语所说:“你有一个苹果,我有一个苹果;如果我们交换,那么我们仍然各有一个。你有一个想法,我有一个想法;如果我们交换,那么我们每个人都会有两个!”

历史

重新审视了判断节点是否为结构的算法,以满足以下用例:"/items/item",尽管它可能只在 XML 文件中出现一次。我认为它更像是一个结构,而不是一个单节点。

© . All rights reserved.