我有一个XML文件可能包含数千个节点,如下所示。
<?xml version="1.0" encoding="utf-8"?>
<root>
<node>
<id>0</id>
<value>data</value>
</node>
<node>
<id>1</id>
<value>data</value>
</node>
<node>
<id>2</id>
<value>data</value>
</node>
</<root>
每个节点都有其“id”,保证不会相互重复,并且它们之间可能存在间隙。 我的问题是使用boost通过使用节点的id搜索某个节点最有效的方法是什么?
感谢。
UPDATE 这就是我做的方式
property_tree::wptree ptree; // has been loaded somewhere
auto nodes = ptree.get_child(L"root");
bool bFound = false;
for (auto& itr : nodes)
{
auto & rec = itr.second;
int id = rec.get<int>(L"id", -1);
if (id == nodeId)
{
bFound = true;
// found it
// get other values
break;
}
}
我不认为扫描整个文件以查找项目是有效的。
答案 0 :(得分:1)
我已经将LibXml2与TextReader接口一起使用。
您可以继续执行xmlReaderRead
并检查模式是否匹配(xmlPatterncompile
和xmlPatternMatch
以查看节点何时匹配。
你甚至可以在那时获得完整的“DOM子树”,这样你就可以获得两全其美的效果。
CAVEAT :libxml ++的
xmlReaderExpand()
包装器和类似的访问器¹被记录为泄漏内存。我已在我们的本地代码库中修复此问题。如果有足够的兴趣和许可,我可以在github上发布一个图书馆版本。
总而言之,它提供与.NET的XpathReader相同的接口:What ever happened to XPathReader
¹所以TextReader::expand()