我有一个相当大的XML文件(~11MB),我使用TinyXPath来定位一些节点。尽管我尝试定位的节点不能在以后的DOM中与其他节点混淆,但XPath查询需要几分钟才能返回。
以下是我的示例XML:
<RootElement>
<Header>
<Location>1234</Location>
... maybe a dozen sibling nodes
</Header>
<EventReport>
<SomeEvent>with a few dozen child nodes</SomeEvent>
... 2,000+ SomeEvent nodes
</EventReport>
</RootElement>
这是我的c ++代码:
TiXmlDocument doc;
doc.LoadFile("C:\\Path\\To\\file.xml");
TiXmlNode *locationNode = TinyXPath::XNp_xpath_node(doc.RootElement(), "//RootElement/Header/Location");
从暂停和检查堆栈跟踪看起来,它似乎正在尝试解析和遍历整个XML结构。但是,RootElement
只有2个子节点:Header
和EventReport
。由于我没有在(非常大的)EventReport
节点下寻找任何东西,我希望这个查询会非常快。
此外,如果我缩小示例XML以仅包含几个SomeEvent
节点,则此查询几乎立即返回。
这是TinyXPath的已知限制吗?有没有更好的方法来构建我的查询以及时返回?
答案 0 :(得分:0)
成本可能不在于评估XPath,而在于将源文档解析为适合XPath引擎的树。您说RootElement只有2个子节点,但在解析文档之前,XPath引擎无法知道这一点。话虽如此,没有理由它需要几分钟。每兆字节一秒是合理的,任何看起来效率低的东西。但是,我不知道TinyXPath技术:它可能是针对尺寸而不是速度进行了优化的?