在 XML 中表示图形



嗨,在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 获得一个孩子时,我基本上必须遍历所有节点并将那里的 name 属性与 B 匹配以找到代表 B 的节点。我可以以某种方式做得更快吗?

既然你有一个图,而不是你最初想到的树,为什么不使用GraphML?

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

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

好吧,我不能说我完全理解你的问题,但我认为你正在尝试从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]);

解析完成后,您将在映射中拥有节点,并按名称进行很好的排序。

无论如何,你可能想看看维基百科关于图表示的摘要,这可能会给你一些想法。

看看RDF/XML。

RDF是语义网(链接数据)的简单数据模型,由三元组(主语,谓词,宾语)组成。它可以表示图形,并且可以以多种格式序列化,包括xml,json(json-ld)和turtle。

最新更新