Если производительность является важным фактором, и / или размер документа велик (оба из которых, кажется, имеют место здесь), разница между анализатором событий (например, SAX или StAX) и собственной реализацией Java XPath заключается в том, чтопоследний создает документ DOM W3C до оценки выражения XPath.[Интересно отметить, что все реализации объектной модели документов Java, такие как DOM или Axiom, используют процессор событий (например, SAX или StAX) для построения представления в памяти, поэтому, если вы когда-либо сможете обойтись только с обработчиком событий,экономя память и время, необходимое для создания DOM.]
Как я уже говорил, реализация XPath в JDK работает с документом DOM W3C.Вы можете увидеть это в реализации исходного кода Java JDK, посмотрев com.sun.org.apache.xpath.internal.jaxp.XPathImpl
, где перед вызовом методаvalu () анализатор должен сначала проанализировать источник:
Document document = getParser().parse( source );
После этого ваши 10 ГБXML будет представлен в памяти (плюс любые накладные расходы) - вероятно, не то, что вы хотите.Хотя вам может потребоваться более «универсальное» решение, ваш пример XPath и разметка XML кажутся относительно простыми, поэтому для XPath нет веских оснований (за исключением, возможно, элегантности программирования ),То же самое будет верно для предложения XProc: это также создаст DOM.Если вам действительно нужна DOM, вы можете использовать Axiom, а не W3C DOM.Axiom имеет более дружественный API и строит свой DOM поверх StAX, поэтому он быстрый и использует Jaxen для своей реализации XPath.Jaxen требуется некоторый вид DOM (W3C DOM, DOM4J или JDOM).Это будет справедливо для всех реализаций XPath, поэтому, если вам действительно не нужно, чтобы XPath придерживался только парсера событий, было бы рекомендовано.
SAX - это старый потоковый API, с StAX новее и намного быстрее,Используя собственную реализацию JDK StAX (javax.xml.stream
) или реализацию Woodstox StAX (что, на мой взгляд, значительно быстрее), я бы порекомендовал создать фильтр событий XML, который сначала совпадает с именем типа элемента(чтобы захватить ваши <txn>
элементы).Это создаст небольшие пакеты событий (элемент, атрибут, текст), которые могут быть проверены на соответствие ваших пользовательских значений.При подходящем совпадении вы можете либо извлечь необходимую информацию из событий, либо направить ограниченные события, чтобы построить из них мини-DOM, если вы обнаружили, что результат легче ориентировать.Но звучит так, что это может быть излишним, если разметка проста.
Вероятно, это будет самый простой и быстрый из возможных подходов и позволит избежать затрат памяти при создании DOM.Если вы передали имена элемента и атрибута в фильтр (чтобы ваш алгоритм сопоставления был настраиваемым), вы можете сделать его относительно общим.