У меня довольно большой XML-файл (~ 11 МБ), и я использую 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? Есть ли лучший способ структурировать мой запрос для своевременного возврата?
Вполне вероятно, что стоимость заключается не в оценке XPath, а в разборе исходного документа в дереве, подходящем для работы движка XPath. Вы говорите, что RootElement имеет только 2 дочерних узла, но у движка XPath нет возможности узнать это, пока документ не будет проанализирован. Сказав это, нет причин, чтобы это заняло минуты. Одна секунда на мегабайт была бы разумной, все остальное выглядит неэффективным. Однако я не знаю технологию TinyXPath: возможно, она оптимизирована по размеру, а не по скорости?