注: この問題も発生する場合は、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);
JVM のデフォルトの JAXP 実装を使用しています。
org.apache.xpath.jaxp.XPathFactoryImpl
org.apache.xpath.jaxp.XPathImpl
JAXP が上記の XPath クエリを最適化して、代わりに単純なクエリを実際に実行する方法を簡単に確認できるため、私は本当に混乱していますgetElementsByTagName()
。しかし、それはしていないようです。この問題は、API によって抽象化され、隠されている、頻繁に使用される約 5 ~ 6 個の XPath 呼び出しに限定されます。これらのクエリには/a/b/c
、常に利用可能な DOM ドキュメントのみに対する単純なパス (変数や条件がないなど) が含まれます。したがって、最適化を行うことができれば、達成するのは非常に簡単になります。
私の質問: XPath の遅さは認められた事実ですか、それとも何か見落としているのでしょうか? より良い(より速い)実装はありますか?または、単純なクエリの場合、XPath を完全に回避する必要がありますか?