在XML中序列化依赖图

时间:2011-08-26 15:50:54

标签: xml graph xml-serialization

您对包含某些元素的xml文件有何看法,这些元素引用了其他元素。这个问题的背景是一个序列化为xml文档的techtree(图形)。例如。技术“大炮”先决条件另外两个节点(元素)“铁”和“火药”。

enter image description here 资料来源:http://www.amazon.com/Programming-Game-Example-Mat-Buckland/dp/1556220782

2 个答案:

答案 0 :(得分:3)

这是一张有向图。我确信有很多基于xml的表示,但想到了graphml:

<graphml>
<graph id="techtree" edgedefault="directed">
    <node id="gunpowder" />
    <node id="iron" />
    <node id="cannons" />
    <edge source="gunpowder" target="cannons" />
    <edge source="gunpowder" target="cannons" />
</graph>
</graphml>

请注意,这只是来自内存,可能需要大量的命名空间和其他内容。

答案 1 :(得分:1)

就其本质而言,XML将树结构引入到文档中。如果元素及其子节点之间的关系被认为是“允许您创建”定义,那么当您遇到某些对象被多次引用的情况时,您将遇到问题。你最终必须指定它们两次,没有明显的方式告诉它们代表同样的事情。

让我们看看你的例子中的铁:

<iron>
    <cannons/>
    <guns/>
</iron>

没问题,伍德会......

<wood>
    <forge/>
    <arrows/>
    <guns/>
</wood>

此处也会显示guns元素。上面的表示非常简单,但是可能会有更多的数据与每个元素相关联,并且您希望避免重复。当你的图形包含循环时,你也会遇到麻烦,虽然我认为在语义上无论如何都不会有效。还要注意木材是枪支的直接要求,但枪支也通过铁 - 锻造木材间接依赖木材。这将代表复杂化。

可以做很多事情。首先,每个元素和包含的结构可以分别放在XML文档中,然后以某种方式引用......

<guns itemId="1">
    <!-- embedded structure -->
</guns>
...
<iron>
    <item>1</item>
</iron>
<wood>
    <item>1</item>
</wood>

但是,这将由您以编程方式解析此类引用。 XML的优点,如解析器,XSLT和对象绑定等工具,部分丢失了。

其他选项是通过XLink链接到元素,这看起来很自然。或者使用XInclude仅定义一次事物,然后将它们包含在不同的地方。解密内容的“内联”XML仍将包含所有重复数据。但至少它现在不再会变得不一致。

但这只是一种看待它的方式。不是试图在XML树中获得与图中相同的方向性,而是如何扭转事物呢?

可以建立“需要”关系,而不是“允许你创建”关系

回到Iron:

<iron>
    <forge/>
</iron>

你现在知道Iron需要一个Forge。枪:

<guns>
    <gunpowder/>
    <iron/>
    <wood/>
</guns>

但问题仍然存在:你不能只是将一个结构嵌入到另一个结构中,因为在某些时候,在不止一个地方需要同样的东西。 Forge需要Wood,但Guns也是如此。

XML适用于树结构,但是当图形不严格遵循这样的结构时,使用XML表示变得困难。至少,从某种意义上讲,你不会从中获得任何重大优势,并且仍然需要自己编程。

我不知道任何(de)可序列化数据表示非常适合任何类型的图形。有一个名为Graphviz的软件包,专门用于图形渲染;它是开源的,所以也许文档和/或代码可以提供一些好的想法。