用XML表示图形

时间:2012-10-15 23:05:57

标签: xml graph

您将以最佳方式表示XML中的图形,其中节点可以是父节点的子节点,也可以是另一个子节点的父节点。它可以引用自身,多个节点可以拥有相同的父节点。一个节点可以有多个父节点。 所有节点都来自同一个类。我想有效地构建它,这样如果我可以从父节点了解子节点,我可以转到特定的子标签,而不必迭代所有节点。可能吗? 例如,这是一个概述,

A->B,C,D

B->C,D

可能看起来像

<Node name=A>
 <childNode name=B>
 <childNode name=C>
 <childNode name=D>
</Node>

<Node name=B>
 <childNode name=C>
 <childNode name=D>
</Node>

那么还有比这更好的方法吗?每当我从A,即B获得一个孩子时,我将不得不基本遍历所有节点,并将名称属性与B匹配,以找到代表B的节点。我能以某种方式更快地完成它吗?

3 个答案:

答案 0 :(得分:6)

由于你有一个图表,而不是你想到的树,为什么不使用GraphML

  

GraphML是一种全面且易于使用的图形文件格式。它   由一个语言核心来描述一个的结构属性   图表和灵活的扩展机制,以添加特定于应用程序   数据

     

与图形的许多其他文件格式不同,GraphML不使用a   自定义语法。相反,它基于XML,因此非常适合作为   各种服务生成,存档的共同点,   或处理图表。

答案 1 :(得分:0)

好吧,我不能说我完全理解你的问题,但我认为你正在尝试用XML文件重建高级语言的(定向)图表,对吧?它有助于了解您在高级语言中的表现形式。或者实际上是语言。假设C ++和邻接列表:

我首先创建一个map<string, Node*>,将名称映射到节点。我的XML看起来像这样:

<edge from='A' to='B' />
<edge from='A' to='C' />
<edge from='A' to='D' />
<edge from='B' to='C' />
<edge from='B' to='D' />

这是相当紧凑的,我可以使用SAX解析器解析它,这总是很好。当我按顺序读取边缘时,我会检查我的地图中是否有节点:如果没有,我会存储它们:

if(mapping.find(from) == map.end()) map.insert(make_pair(from, new Node()));
if(mapping.find(to) == map.end()) map.insert(make_pair(to, new Node()));

一旦两个终端节点都在地图中,我们就可以通过以下方式添加边缘:

mapping[from]->add_egde_to(mapping[to]);

解析完成后,您将拥有地图中的节点,并按名称排序。

无论如何,你可能想看一下维基百科关于graph representations的摘要,它可能会给你一些想法。

答案 2 :(得分:0)

看看RDF / XML。

RDF是由三元组(Subject,Predicate,Object)组成的语义Web(链接数据)的简单数据模型。它可以表示图形,并可以多种格式进行序列化,包括xml,json(json-ld)和turtle。