0

我正在用 C++ 构建一个符合和验证的 XML 解析器,并试图使其轻量级,以便在袖珍电脑中使用。

一开始我决定像 SAX 一样向我的解析器添加一些“事件”,通知元素、处理指令等。

此事件由构建 xml 的 DOM 树的派生类获取。

当我试图主要处理实体(如果定义的话,它可以包含元素、pi 和内部注释)及其分辨率时,我的疑虑出现了。

例如,我可以创建一个 XMLEntityRef 类,该类引用在某些 XMLDocType 对象中定义的某些 XMLEntity,例如 .NET system.xml 解析器。

据我所知,对于大多数用途,应用程序需要知道一个元素、它的内容、它各自的属性和它们各自的值......只有字符串......它不关心元素内容是否由 cdata 对象、实体引用形成和/或纯文本......这同样适用于属性值。

因此,我的问题如下:将每个出现的 xml 对象传递给应用程序并让它(或帮助器类)通过连接文本和解析的实体引用来构建例如结果属性的值有什么好处?

如果我正在进行投票,请回答:您的应用程序是否需要了解 cdata 标签以及它们在 xml 文件中的位置,或者您让事情变得简单......您想知道一个元素的完整内容值一个字符串而不用担心它是如何构建的?

最好的问候, Mauro H. Leggieri

4

3 回答 3

1

一般xml的重量不轻。使用 JSON 会更好。

于 2009-11-28T22:27:36.173 回答
1

在构建解析器时,我认为您不应该假设应用程序将如何使用 xml,而是为每个 xml 节点提供最细粒度的数据以提供最大的灵活性。虽然这可能需要在使用应用程序方面做更多的工作,但他们将能够完成他们需要做的任何事情。祝你好运。

于 2009-11-29T00:24:57.760 回答
1

我正在用 C++ 构建一个符合和验证的 XML 解析器,并试图使其轻量级

没有轻量级的一致性(更不用说验证)解析器这样的东西。要成为符合规范的解析器,您必须了解可以放入 DTD 外部子集的所有内容,这确实是一项艰巨的工作。遗憾的是,XML 规范最终被所有 SGML DTD crud 压得喘不过气来,但我们现在坚持下去。

您的应用程序是否需要了解 cdata 标记以及它们在 xml 文件中的位置

通常没有。默认情况下,DOM Level 3 LS 确实要求 CDATA 部分在 DOM 中保留为 CDATASection 节点,但几乎没有应用程序关心。

(如果问题是关于我的应用程序,那么可以,因为我的应用程序是一个模板系统,可以将 CDATA 部分保留在原来的位置。但仍然如此。)

尝试主要处理实体时出现了我的疑虑

上帝是的。实体引用是一场彻底的灾难。使 DOM 实现以符合 DOM Level 3 Core/LS 的方式支持它们是非常复杂的。尽可能避免。

于 2009-11-29T02:02:51.970 回答