如何最有效地在XML文件中找到节点(C ++)?

时间:2016-05-02 07:04:50

标签: xml c++11 boost

我有一个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;
    }
}

我不认为扫描整个文件以查找项目是有效的。

1 个答案:

答案 0 :(得分:1)

我已经将LibXml2与TextReader接口一起使用。

您可以继续执行xmlReaderRead并检查模式是否匹配(xmlPatterncompilexmlPatternMatch以查看节点何时匹配。

你甚至可以在那时获得完整的“DOM子树”,这样你就可以获得两全其美的效果。

  

CAVEAT :libxml ++的xmlReaderExpand()包装器和类似的访问器¹被记录为泄漏内存。我已在我们的本地代码库中修复此问题。如果有足够的兴趣和许可,我可以在github上发布一个图书馆版本。

总而言之,它提供与.NET的XpathReader相同的接口:What ever happened to XPathReader

¹所以TextReader::expand()