0

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文字列をフォーマットするより良い方法があるかどうか疑問に思っていました。

4

1 に答える 1

0

GRD_ERRORSあなたのスニペットから、 vs.GRD_ERRORS_TMPWRK_REGISTRATIONvs.に関する問題がありますWRK_DNA_REGISTRATION

それを無視して、書き直すことをお勧めします

//cache/content/transaction/page
  /widget[@name='PAGE_ID'][text()='WRK_DNA_REGISTRATION']
  /../widget[@name='TRANS_DETAIL_ID'][text()='77147']
  /../widget[@name='GRD_ERRORS_TEMP']

なので

//cache/content/transaction/page
  [widget[@name='PAGE_ID'][text()='WRK_REGISTRATION']]
  [widget[@name='TRANS_DETAIL_ID'][text()='77147']]
  /widget[@name='GRD_ERRORS']

私の目には、コードが読みやすくなり、あなたが意味しているように見えることをより明確に表現しているからpageです@name。または、それがあなたの考えに近い場合は、

//cache/content/transaction/page/widget[@name='GRD_ERRORS']
  [preceding-sibling::widget[@name='PAGE_ID'][text()='WRK_REGISTRATION']]
  [preceding-sibling::widget[@name='TRANS_DETAIL_ID'][text()='77147']]
于 2012-03-29T17:26:39.610 に答える