ПРИМЕЧАНИЕ. Если вы столкнулись с этой проблемой, проголосуйте за нее в Apache JIRA:
Я пришел к удивительному выводу, что это:
Element e = (Element) document.getElementsByTagName("SomeElementName").item(0);
String result = ((Element) e).getTextContent();
Кажется, это невероятно в 100 раз быстрее, чем это:
// Accounts for 30%, can be cached
XPathFactory factory = XPathFactory.newInstance();
// Negligible
XPath xpath = factory.newXPath();
// Negligible
XPathExpression expression = xpath.compile("//SomeElementName");
// Accounts for 70%
String result = (String) expression.evaluate(document, XPathConstants.STRING);
Я использую реализацию JAXP по умолчанию для JVM:
org.apache.xpath.jaxp.XPathFactoryImpl
org.apache.xpath.jaxp.XPathImpl
Я действительно запутался, потому что легко увидеть, как JAXP может оптимизировать приведенный выше запрос XPath, чтобы вместо этого фактически выполнить простой getElementsByTagName()
. Но, похоже, это не так. Эта проблема ограничена примерно 5-6 часто используемыми вызовами XPath, которые абстрагируются и скрываются API. Эти запросы включают простые пути (например, /a/b/c
, без переменных, условий) только к всегда доступному документу DOM. Таким образом, если оптимизация может быть выполнена, ее будет довольно легко достичь.
Мой вопрос: является ли медлительность XPath признанным фактом, или я что-то упускаю из виду? Есть ли лучшая (более быстрая) реализация? Или мне следует вообще избегать XPath для простых запросов?
jaxen
. - person Johan Sjöberg   schedule 14.06.2011jaxen
действительно может стать вариантом в будущем... - person Lukas Eder   schedule 14.06.2011jaxen
. В моем тестовом случае это еще хуже, по сравнению сsaxon
илиxalan
... - person Lukas Eder   schedule 14.06.2011xalan
выглядит как динозавр :-) - person Lukas Eder   schedule 14.06.2011