您将以最佳方式表示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的节点。我能以某种方式更快地完成它吗?
答案 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。