在C+;中存储XML树的最有效数据结构+; 我在C++中用XML做了一些工作,我想知道存储XML数据的最佳数据结构是什么。请不要只告诉我你过去听说过什么;我想知道最有效的结构是什么。我希望能够以最小的内存开销和查找时间存储任意XML树(假设它是有效的)

在C+;中存储XML树的最有效数据结构+; 我在C++中用XML做了一些工作,我想知道存储XML数据的最佳数据结构是什么。请不要只告诉我你过去听说过什么;我想知道最有效的结构是什么。我希望能够以最小的内存开销和查找时间存储任意XML树(假设它是有效的),c++,xml,qt,C++,Xml,Qt,我最初的想法是散列,但我不知道如何处理同一标记的多个子项,以及如何处理属性 Qt解决方案是可以接受的,但我更关心的是整体结构,而不是特定的库。感谢您的输入。最有效的结构是从DTD或模式派生的一组类,这些类定义了您要处理的特定XML实例。(您肯定不会处理任意XML吗?)标记由类表示。单个子项可以用字段表示。具有min…max arity的Childen可以由包含数组的字段表示。具有不确定arity的子级可以由动态分配的数组表示。属性和子项可以存储为字段,通常使用推断数据类型(如果属性表示数字,为什

我最初的想法是散列,但我不知道如何处理同一标记的多个子项,以及如何处理属性


Qt解决方案是可以接受的,但我更关心的是整体结构,而不是特定的库。感谢您的输入。

最有效的结构是从DTD或模式派生的一组类,这些类定义了您要处理的特定XML实例。(您肯定不会处理任意XML吗?)标记由类表示。单个子项可以用字段表示。具有min…max arity的Childen可以由包含数组的字段表示。具有不确定arity的子级可以由动态分配的数组表示。属性和子项可以存储为字段,通常使用推断数据类型(如果属性表示数字,为什么将其存储为字符串?)。使用这种方法,您可以经常使用原生C++访问辅助工具导航到XML文档中的特定位置,例如, root->tag1.itemlist[1]->说明

所有这些都可以从模式或DTD自动生成。有一些工具可以做到这一点。
提供了一些。我没有这方面的具体经验(尽管我为Java和COBOL构建了类似的工具)。

只需使用DOM存储解析后的XML文件即可。当然有C++ DOM库。
您可以使用XPath表达式查询DOM。

我不确定最有效的方法是什么,但是既然DOM已经存在,为什么要重新发明轮子


按名称对所有节点进行散列以进行查找可能是有意义的,但仍应使用DOM作为基本表示。

您应首先确定效率要求,具体数字包括存储、速度等。如果不知道这些信息,您就无法判断您的实现是否满足需求

而且,如果您有这个需求,您可能会发现DOM满足它,并且具有零代码维护的优势

对于未来的程序员来说,这将是一场噩梦,因为他们想知道为什么有人编写了DOM的替代实现


实际上,你所做的任何事情都只是DOM实现,但可能不完整,还有索引优化等。我个人的感觉是,重新创建轮子应该是你考虑的最后一件事。

< P>有一个C++ XML库已经被构建:XECES。

\include\boost-1\u 46\u 1\boost\intrusive中有一些树结构\ 有一棵红黑相间的树和一棵avl树,但我很久没有看过它们了,我不知道它们是否特别有用,我想不是

XML是一种树形结构。您不知道该结构将是什么,除非它定义了DTD并包含在中(尽管validrome的验证器打开了!DOCTYPEs,它不应该打开)

有关树示例,请参见

您可能会得到一些不符合DTD或模式的内容。完全没有结构。像这样:

<?xml version="1.0"?>
<a>
 <b>hello
  <e b="4"/>
  <c a="mailto:jeff@nowhere.com">text</c>
 </b>
 <f>zip</f>
 <z><b /><xy/></z>
 <zook flag="true"/>
 <f><z><e/></z>random</f>
</a>

你好
文本
拉链
随机的
我知道确实存在可查询的XML数据库,但我对它们了解不多,只知道它们可以处理非结构化数据

PHP有一个XML解析器,它将XML解析器插入PHP所称的数组(不像C/C++数组,因为数组可以有数组),您可以对其进行修改,以查看XML数据结构中应该包含哪些内容的示例

您基本上想要的是一个非常灵活的树,其中根指针指向一个列表。列表中的每个节点都包含一个可以指向列表的指针。它应该是一个有序的列表,所以将其设置为一个。如果您的目的是能够删除数据,请使用a而不是-它是有序的,同时具有易于操作的功能

警告:.erase(迭代器i)删除从i开始和之后的所有内容。 .erase(迭代器i1,迭代器i2)删除从i1到i2的所有内容,但不包括i2。 .end()是一个迭代器,它在列表末尾后指向1,基本上为零。 .begin()是指向列表开头的迭代器

学习在for语句中使用for_each(开始、结束、函数){}或使用常规for语句

迭代器就像指针。这样对待他们

#include <iterator>
#include <list>
#include <iostream>
using namespace std;
list<class node> nodelist;
list<class node>::iterator nli;
for (nli=nodelist.begin(); nli!=nodelist.end(); nli++) {
    cout<<nli->getData()<<endl;
}
#包括
#包括
#包括
使用名称空间std;
列出节点列表;
列表::迭代器nli;
对于(nli=nodelist.begin();nli!=nodelist.end();nli++){

cout我认为存储xml的最有效的数据结构可能是vtd xml,它使用长数组而不是大量互连的结构/类。主要思想是结构/类基于小内存分配器,这在正常情况下会产生严重的开销。有关更多详细信息,请参阅本文


我自己也在探索这个问题。这些是我的想法

a) xml中的每个元素要么是节点,要么是(键、值)对。 b) 将每个元素存储在散列中。为每个元素分配一种类型,即“节点”、“键、值”。 c) 每个元素都有一个父元素。为每个元素指定一个值。 d) 每个元素可能有子元素/引用,也可能没有子元素/引用。将子元素存储在将定义引用的B树中

任何键的搜索时间都是O(1)。引用遍历可以有元素内所有子元素的列表


请回顾并建议我遗漏的内容。

给定一个根节点,我希望找到给定标记的所有元素,然后对每个元素执行一些操作。Javascript的getElementsByTagName和getElementById之类的内容是理想的。什么是最佳?构建最快?Fa