У меня есть класс xpathutility, который я использую во всем приложении, чтобы получить строку или результаты узла из выражения xpath:
public static String getStringResult(String expression, Document doc) {
String outString = new String();
try {
outString = (String)xpath.compile(expression).evaluate(doc, XPathConstants.STRING);
} catch (XPathExpressionException e) {
e.printStackTrace(System.out);
}
return outString;
}
public static NodeList getNodeListResult(String expression, Document doc) {
NodeList outList = null;
try {
outList = (NodeList)xpath.compile(expression).evaluate(doc, XPathConstants.NODESET);
} catch (XPathExpressionException e) {
e.printStackTrace(System.out);
}
return outList;
}
Для инициализации фабрики я использовал следующее, чтобы сделать поток безопасным, нашел его поверх inte rnet:
private static final ThreadLocal<XPathFactory> XPATH_FACTORY = new ThreadLocal<XPathFactory>()
{
@Override
protected XPathFactory initialValue()
{
return XPathFactory.newInstance();
}
};
private static final XPath xpath= XPATH_FACTORY.get().newXPath();
Но когда я выполняю это из нескольких потоков, это дает мне нулевое ожидание указателя для xpath. Нужно знать, как сделать это потокобезопасным.