Есть ли какой-либо процессор XPath для модели SAX?

Другая крошечная функция - преобразовывает Fixnum в любую основу до 36:

>> 1234567890.to_s(2)
=> "1001001100101100000001011010010"

>> 1234567890.to_s(8)
=> "11145401322"

>> 1234567890.to_s(16)
=> "499602d2"

>> 1234567890.to_s(24)
=> "6b1230i"

>> 1234567890.to_s(36)
=> "kf12oi"

И поскольку Huw Walters прокомментировал, преобразовывание другого пути так же просто:

>> "kf12oi".to_i(36)
=> 1234567890
56
задан TomTasche 8 April 2012 в 20:09
поделиться

8 ответов

Я не думаю, что xpath работает с SAX, но вы можете взглянуть на StAX, который представляет собой расширенный потоковый XML API для Java.

http://en.wikipedia.org / wiki / StAX

-1
ответ дан 26 November 2019 в 17:31
поделиться

Стандартный javax xpath API технически уже работает с потоками; javax.xml.xpath.XPathExpression можно сравнить с InputSource , который, в свою очередь, может быть построен с помощью Reader . Я не думаю, что он строит DOM под покровом.

0
ответ дан 26 November 2019 в 17:31
поделиться

Существуют реализации XPath на основе SAX / StAX, но они поддерживают только небольшое подмножество выражений / осей XPath в значительной степени из-за того, что SAX / StAX использует только прямой характер. Лучшая альтернатива, о которой я знаю, - расширенный VTD-XML , он поддерживает полный xpath, частичную загрузку документа через mem-map ... и максимальный размер документа 256 ГБ, но вам понадобится 64-разрядная JVM, чтобы использовать его в полной мере

2
ответ дан 26 November 2019 в 17:31
поделиться

Ммм, я не знаю, действительно ли я вас понимаю. Насколько мне известно, модель SAX ориентирована на события. Это означает, что вы что-то делаете, если во время синтаксического анализа обнаруживается определенный узел. Да, это лучше для памяти, но я не понимаю, как бы вы хотели добавить в него XPath. Поскольку SAX не строит модель, я не думаю, что это возможно.

0
ответ дан 26 November 2019 в 17:31
поделиться

Что вы можете сделать, так это подключить трансформатор XSL к входному источнику SAX. Ваша обработка будет последовательной, и препроцессор XSL попытается перехватить ввод, когда он придет, чтобы воспроизвести любой результат, который вы указали. Вы можете использовать это, чтобы извлечь значение пути из потока. Это будет особенно удобно, если вы хотите получить кучу разных результатов XPATH за один проход.

В результате вы получите (обычно) XML-документ, но вы можете получить ожидаемый результат, скажем, из StreamResult без особых хлопот.

1
ответ дан 26 November 2019 в 17:31
поделиться

SAX работает только вперед, в то время как запросы XPath могут перемещаться по документу в любом направлении (рассмотрите parent :: , ancestor :: , ] previous :: и previous-sibling :: оси). Я не понимаю, как это вообще возможно. Наилучшим приближением будет своего рода модель DOM с отложенной загрузкой, но в зависимости от ваших запросов это может дать или не дать вам никакой выгоды - всегда есть запрос наихудшего случая, такой как // * [. ! = предшествующий :: *] .

6
ответ дан 26 November 2019 в 17:31
поделиться

Have a look at the streaming mode of the Saxon-SA XSLT-processor.

http://www.saxonica.com/documentation/sourcedocs/serial.html

"The rules that determine whether a path expression can be streamed are:

  • The expression to be streamed starts with a call on the document() or doc() function.
  • The path expression introduced by the call on doc() or document must conform to a subset of XPath defined as follows:

  • any XPath expression is acceptable if it conforms to the rules for path expressions appearing in identity constraints in XML Schema. These rules allow no predicates; the first step (but only the first) can be introduced with "//"; the last step can optionally use the attribute axis; all other steps must be simple Axis Steps using the child axis.

  • In addition, Saxon allows the expression to contain a union, for example doc()/(*/ABC | /XYZ). Unions can also be expressed in abbreviated form, for example the above can be written as doc()//(ABC|XYZ).
  • The expression must either select elements only, or attributes only, or a mixture of elements and attributes.

  • Simple filters (one or more) are also supported. Each filter may apply to the last step or to the expression as a whole, and it must only use downward selection from the context node (the self, child, attribute, descendant, descendant-or-self, or namespace axes). It must not be positional (that is, it must not reference position() or last(), and must not be numeric: in fact, it must be such that Saxon can determine at compile time that it will not be numeric). Filters cannot be applied to unions or to branches of unions. Any violation of these conditions causes the expression to be evaluated without the streaming optimization.

  • These rules apply after other optimization rewrites have been applied to the expression. For example, some FLWOR expressions may be rewritten to a path expression that satisfies these rules.

  • The optimization is enabled only if explicitly requested, either by using the saxon:stream() extension function, or the saxon:read-once attribute on anXSLT xsl:copy-of instruction, or the XQuery pragma saxon:stream. It is available only if the stylesheet or query is processed using Saxon-SA."

Note: It is most likely in the commercial version this facility is available. I've used Saxon extensively earlier, and it is a nice piece of work.

1
ответ дан 26 November 2019 в 17:31
поделиться

Извините, немного поздний ответ здесь - кажется, что это возможно для подмножества XPath - в целом очень сложно из-за того, что XPath может соответствовать как переадресации, так и назад из «тока» точки. Я знаю о двух проектах, которые решают его в некоторой степени с использованием штатных машин: http://spex.sourceforge.net & http://www.cs.umd.edu/projects/ XSQ . Я не посмотрел на них подробно, но кажется, что они используют аналогичный подход.

4
ответ дан 26 November 2019 в 17:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: