将XML建模为对象还是XML?

时间:2016-04-09 13:32:09

标签: xml oop language-agnostic

在阅读XML时,我应该尝试对对象进行建模(在OO意义上)还是将内容保留为XML实体?

我在尝试使用面向对象语言读取“强类型”(基于模式的)XML内容时,在两种方法之间做出决定:

  1. 首先,我将创建一个类型化的类层次结构,以表示该模式的所有可能元素类型及其类型属性和所有。然后,当我解析文档时,我将递归扫描每个节点并创建一个合适的类实例,再现所有嵌套,属性,子项(作为集合)等。然后,我可以在我的应用程序中操作此对象树保存时,我必须调用对象'toXml()方法,或以某种方式将对象“转换”回XML格式。

  2. 使用一些现成的XML库(任何高级语言都有一个或多个),我会解析文档并将其结构已经存储在内存中。这意味着一个节点树。然后我会直接操作它们并使用库方法将所有内容保存回文件。此外,如果我的应用程序需要表示数据,我可以创建代理对象,其属性和方法实际上是指基础节点结构。

  3. 问题是:通常如何做?是否有一种“正确”的方式在XML和OO之间进行映射并返回?是否有一种众所周知的方式,OO应该使用XML,或者OO应该使用XML的方式?

2 个答案:

答案 0 :(得分:1)

如果您使用XML作为对象的序列化格式,第一种方法是有意义的。在这种情况下,XML将包含创建对象结构的所有信息。对象和XML节点之间应该存在一对一的映射,并且每个对象都应该负责将自己转换为DOM数据和从DOM数据转换。

如果您的对象仅需要XML中的部分信息,则第二种方法会更好。另一个用例是遗留XML模式,可能存在设计缺陷,您不希望直接映射到对象结构。

顺便说一句,对于这两种方法,我建议使用现成的XML库。我不确定你为什么认为这只能用于第二个。

答案 1 :(得分:1)

你的#1正在重塑JAXB。你的#2正在重塑DOM

如果您希望针对域名的OO表示进行操作,请使用#1。

如果您希望对域的XML表示进行操作,请使用#2。也可以考虑作为#2的替代品:

  • 基于事件的XML解析器
  • 基于XSLT的XML转换

由于熟悉,请注意不要滑入#1。 #1的真正理由应该基于OO设计作为架构核心的合理需求。 XML到XML的映射,即使是复杂的映射,也不需要通过中间OO表示,除非必须在OO领域进行大量处理。只需在XSLT中就可以优雅地处理纯XML到XML的转换。