将 XML 建模为对象还是 XML?
Model XML as objects or as XML?
阅读 XML 时,我应该尝试建模对象(在 OO 意义上)还是将内容保留为 XML 个实体?
在使用面向对象语言阅读 "strongly typed"(基于模式)XML 内容时,我试图在两种方法之间做出决定:
首先,我会创建一个类型化的 class 层次结构来表示该架构的每个可能的元素类型及其类型化属性和所有元素。然后,当我解析一个文档时,我会递归地扫描每个节点并创建一个适当的 class 实例,复制所有的嵌套、属性、子项(作为集合)等。然后,我可以像我一样操作这个对象树想要在我的应用程序中,并且在保存回来时我必须调用对象的 toXml()
方法,或者以某种方式 "convert" 对象返回 XML 格式。
使用一些现成的 XML 库(任何高级语言都有一个或多个),我会解析文档并将其结构保存在内存中。那将意味着一棵节点树。然后我会直接操作它们,并可以使用库方法将所有内容保存回文件。此外,如果我的应用程序需要数据表示,我可以创建代理对象,其属性和方法实际上是指底层节点结构。
问题是:通常是怎么做的?是否有 "right" 方法在 XML 和 OO 之间来回映射? OO应该使用众所周知的方式XML,还是OO应该使用XML的方式?
如果您使用 XML 作为对象的序列化格式,第一种方法是有意义的。在这种情况下,XML 将包含创建对象结构的所有信息。对象和 XML 节点之间应该存在一对一的映射,并且每个对象都应该负责将自身与 DOM 数据相互转换。
如果您的对象只需要来自 XML 的部分信息,则第二种方法更好。另一个用例是遗留 XML 架构,可能存在设计缺陷,您不想直接映射到对象结构。
顺便说一句,对于这两种方法,我强烈建议使用现成的 XML 库。我不确定您为什么认为这只能针对第二个完成。
您的#1 正在重塑 JAXB. Your #2 is reinventing DOM。
如果您希望针对您的域的 OO 表示进行操作,请使用 #1。
如果您希望针对您的域的 XML 表示进行操作,请使用 #2。也可以考虑作为#2 的替代方案:
- 基于事件的 XML 解析器
- 基于 XSLT 的 XML 转换
注意不要因为熟悉而滑入#1。 #1 的真正理由应该基于将 OO 设计作为体系结构核心的合理需求。 XML-to-XML 映射,即使是复杂的映射,也永远不需要通过中间 OO 表示,除非必须在 OO 领域中进行大量处理。纯 XML-to-XML 转换可以单独在 XSLT 中优雅地处理。
阅读 XML 时,我应该尝试建模对象(在 OO 意义上)还是将内容保留为 XML 个实体?
在使用面向对象语言阅读 "strongly typed"(基于模式)XML 内容时,我试图在两种方法之间做出决定:
首先,我会创建一个类型化的 class 层次结构来表示该架构的每个可能的元素类型及其类型化属性和所有元素。然后,当我解析一个文档时,我会递归地扫描每个节点并创建一个适当的 class 实例,复制所有的嵌套、属性、子项(作为集合)等。然后,我可以像我一样操作这个对象树想要在我的应用程序中,并且在保存回来时我必须调用对象的
toXml()
方法,或者以某种方式 "convert" 对象返回 XML 格式。使用一些现成的 XML 库(任何高级语言都有一个或多个),我会解析文档并将其结构保存在内存中。那将意味着一棵节点树。然后我会直接操作它们,并可以使用库方法将所有内容保存回文件。此外,如果我的应用程序需要数据表示,我可以创建代理对象,其属性和方法实际上是指底层节点结构。
问题是:通常是怎么做的?是否有 "right" 方法在 XML 和 OO 之间来回映射? OO应该使用众所周知的方式XML,还是OO应该使用XML的方式?
如果您使用 XML 作为对象的序列化格式,第一种方法是有意义的。在这种情况下,XML 将包含创建对象结构的所有信息。对象和 XML 节点之间应该存在一对一的映射,并且每个对象都应该负责将自身与 DOM 数据相互转换。
如果您的对象只需要来自 XML 的部分信息,则第二种方法更好。另一个用例是遗留 XML 架构,可能存在设计缺陷,您不想直接映射到对象结构。
顺便说一句,对于这两种方法,我强烈建议使用现成的 XML 库。我不确定您为什么认为这只能针对第二个完成。
您的#1 正在重塑 JAXB. Your #2 is reinventing DOM。
如果您希望针对您的域的 OO 表示进行操作,请使用 #1。
如果您希望针对您的域的 XML 表示进行操作,请使用 #2。也可以考虑作为#2 的替代方案:
- 基于事件的 XML 解析器
- 基于 XSLT 的 XML 转换
注意不要因为熟悉而滑入#1。 #1 的真正理由应该基于将 OO 设计作为体系结构核心的合理需求。 XML-to-XML 映射,即使是复杂的映射,也永远不需要通过中间 OO 表示,除非必须在 OO 领域中进行大量处理。纯 XML-to-XML 转换可以单独在 XSLT 中优雅地处理。