您对包含某些元素的xml文件有何看法,这些元素引用了其他元素。这个问题的背景是一个序列化为xml文档的techtree(图形)。例如。技术“大炮”先决条件另外两个节点(元素)“铁”和“火药”。
资料来源:http://www.amazon.com/Programming-Game-Example-Mat-Buckland/dp/1556220782
答案 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的软件包,专门用于图形渲染;它是开源的,所以也许文档和/或代码可以提供一些好的想法。