анализировать только определенное поддерево файла XML - PullRequest
2 голосов
/ 06 марта 2010

У меня есть массивный XML-файл. Однако меня интересует только одно маленькое поддерево этого массивного дерева. Я хочу разобрать это поддерево, но я не хочу тратить время на разбор всего массивного дерева, когда собираюсь использовать только небольшую его часть.

В идеале я хотел бы сканировать файл, пока не найду начало этого поддерева, проанализировать поддерево, пока не достигну его конца, а затем даже не потрудиться прочитать остальную часть файла. Может быть, даже описать интересующее меня поддерево с помощью выражения XPath. Есть ли способ сделать это, используя lxml ? Похоже, что вы могли бы сделать что-то подобное, используя метод iterparse(), но, основываясь на документах, похоже, что он не производит анализируемый объект, который я хочу использовать. Есть предложения?

(Использование lxml не обязательно, но я хочу использовать Python, и в идеале я бы хотел, чтобы он был быстрым.)

Ответы [ 2 ]

1 голос
/ 06 марта 2010

У меня сложилось впечатление, что iterparse - это то, что вы хотите. Глядя на раздел «Выборочные события тегов» на http://lxml.de/parsing.html, кажется, что это дает вам то, что вы хотите:

context = etree.iterparse(xmlfile, tag="yourSubTree")
action, elem = context.next()
etree.iterwalk(elem, ...)...

Похоже, что XPath также может работать, но я предполагаю, что XPath читает все дерево перед возвратом, в то время как я ожидаю, что itarparse будет обходить только дерево, пока оно не совпадет. Стоило бы профилировать два подхода.

0 голосов
/ 06 марта 2010

Iterparse по-прежнему требует синтаксического анализа всего, что вам нужно. Может быть более эффективно извлечь поддерево перед тем, как передать его в анализатор с помощью регулярного выражения. Вы можете попробовать написать синтаксический анализатор саксофона. Sax, вероятно, медленнее, чем lxml, но он не использует много памяти, поэтому в некоторых случаях он может быть лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...