dom4jとxPathを使用してxmlを解析するアプリケーションを継承しました。
解析される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の文字列です。
コードは、xPathで提供されたPAGE_IDとTRANS_DETAIL_IDを持つページのGRD_ERRORノードを取得しようとしています。
要求されたノードが検索対象のxmlにあるにもかかわらず、このselectSingleNode要求の断続的な(〜1-2%)失敗(返されたノードがnull)が表示されます。
xPathでtext()=を使用することに関連するいくつかの落とし穴があることを知っており、このタイプの検索用にxPath文字列をフォーマットするより良い方法があるかどうか疑問に思っていました。