XML元素层次结构引用

时间:2009-07-06 19:02:01

标签: xml reference hierarchy cross-reference

我正在查看可用于数据交换目的的XML格式的有限深度图的可能表示。问题在于如何引用边标记中的节点。我看到的两种策略是a)使用唯一标识符或b)使用路径。

唯一ID:

<graph id="g0">
  <node id="n0"/>
  <node id="n1"/>
  <edge from="n1" to="n0"/>
</graph>
<graph id="g1">
  <node id="n2"/>
</graph>
<edge from="n2" to="n1"/>

路径:

<graph id="0">
  <node id="0"/>
  <node id="1"/>
  <node id="2"/>
  <edge from="1" to="0"/>
  <edge from="2" to="1"/>
</graph>
<graph id="1">
  <node id="0"/>
</graph>
<edge from="1:0" to="0:2"/>

这类事情的标准程序是什么?从我收集的信息来看,独特的标识符方法似乎更为普遍。我的问题是图表变得非常大,有:

  • 为了从/向XML文件读取/写入边缘,将对象映射到其ID的非常大的哈希表的必要性
  • 文件本身大于使用路径写入的文件,因为如果边缘是图形的内部,则无法省略冗余路径组件。

思想?

更新1

请注意,它不是一个平面图;它的一个或多个图互连。它们每个都有局部索引元素,但是将它们全部展平并跟踪它们之间的边缘有点令人讨厌。

更新1.1 : 注意到使用GraphML中的子图,它们实际上使用复杂的键,这使得可以将本地节点id从全局节点中分离出来。

更新2

是的,显然这不是一个格式良好的XML和缺少标签以及各种模式声明。

2 个答案:

答案 0 :(得分:3)

有一个描述此类图表的模式:请参阅GraphML

示例:

<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns
     http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
  <graph id="G" edgedefault="undirected">
    <node id="n0"/>
    <node id="n1"/>
    <node id="n2"/>
    <node id="n3"/>
    <node id="n4"/>
    <node id="n5"/>
    <node id="n6"/>
    <node id="n7"/>
    <node id="n8"/>
    <node id="n9"/>
    <node id="n10"/>
    <edge source="n0" target="n2"/>
    <edge source="n1" target="n2"/>
    <edge source="n2" target="n3"/>
    <edge source="n3" target="n5"/>
    <edge source="n3" target="n4"/>
    <edge source="n4" target="n6"/>
    <edge source="n6" target="n5"/>
    <edge source="n5" target="n7"/>
    <edge source="n6" target="n8"/>
    <edge source="n8" target="n7"/>
    <edge source="n8" target="n9"/>
    <edge source="n8" target="n10"/>
  </graph>
</graphml>

答案 1 :(得分:0)

  

文件本身大于使用路径写入的文件,因为如果边缘是图形的内部,则不能省略冗余路径组件。

这一点是过早优化。 XML解析器/编写器不会阻塞大型文件,如果考虑存储大小,XML通常可以很好地压缩ZIP。

  

为了从/向XML文件读取/写入边缘,将对象映射到其ID的非常大的哈希表的必要性

这是一个实施问题。如果将XML读/写例程写入图形,节点和边缘类本身而不是尝试在单独的结构中维护映射,那么当然可以避免使用像这样的大型哈希表。图表很容易序列化和反序列化。

唯一ID可能是要走的路。如果您以类似于您提议的层级方式构建ID,那么它也将是相对人类可读的,这是XML的目标之一。