Я унаследовал приложение, которое анализирует xml, используя dom4j и xPath:
Анализируемый xml похож на следующее:
<cache>
<content>
<transaction>
<page>
<widget name="PAGE_ID">WRK_REGISTRATION</widget>
<widget name="TRANS_DETAIL_ID">77145</widget>
<widget name="GRD_ERRORS" />
</page>
<page>
<widget name="PAGE_ID">WRK_REGISTRATION</widget>
<widget name="TRANS_DETAIL_ID">77147</widget>
<widget name="GRD_ERRORS" />
</page>
<page>
<widget name="PAGE_ID">WRK_PROCESSING</widget>
<widget name="TRANS_DETAIL_ID">77152</widget>
<widget name="GRD_ERRORS" />
</page>
</transaction>
</content>
</cache>
Поиск отдельных узлов осуществляется с помощью следующего:
String xPathToGridErrorNode = "//cache/content/transaction/page/widget[@name='PAGE_ID'][text()='WRK_DNA_REGISTRATION']/../widget[@name='TRANS_DETAIL_ID'][text()='77147']/../widget[@name='GRD_ERRORS_TEMP']";
org.dom4j.Element root = null;
SAXReader reader = new SAXReader();
Document document = reader.read(new BufferedInputStream(new ByteArrayInputStream(xmlToParse.getBytes())));
root = document.getRootElement();
Node gridNode = root.selectSingleNode(xPathToGridErrorNode);
где xmlToParse - строка XML, аналогичная приведенной выше выдержке.
Код пытается получить узел GRD_ERROR для страницы с PAGE_ID и TRANS_DETAIL_ID, предоставленными в xPath.
Я вижу периодический (~ 1-2%) сбой (возвращаемый узел является нулевым) этого запроса selectSingleNode, даже если запрошенный узел находится в искомом xml.
Я знаю, что есть некоторые ошибки, связанные с использованием text () = в xPath, и мне было интересно, есть ли лучший способ отформатировать строку xPath для этого типа поиска.