嗨,在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。