2015-05-05 48 views
2

我有XML看起來大致如下:從xpath查詢子集?

<Dispatch ID = "JJJJ"> 
    <Log ID = "150504BCFSP00072"> 
     <LogTime>"May 4 2015 5:48PM"</LogTime> 
     <LogType>"1125-KKKK"</LogType> 
     <LogDetails> 
      <details> 
       <DetailTime>"May 4 2015 5:48PM"</DetailTime> 
       <IncidentDetail>"[1] The Thing I Want"</IncidentDetail> 
       <DetailTime>"May 4 2015 5:49PM"</DetailTime> 
       <IncidentDetail>"[2] The Thing I Don't Want"</IncidentDetail> 
      </details> 
     </LogDetails> 
    </Log> 
</Dispatch> 

我想提取日誌中的所有IncidentDetail文本,其中站ID是JJJJ,&其中的日誌類型包含「KKKK」,其IncidentDetail開頭[ 1](使它成爲潛在許多人的第一次更新)。到目前爲止,我有這個XPath查詢:

//Dispatch[@ID='JJJJ']//Log/LogType[contains(.,'KKKK')] 

這讓我的事件列表如下:

Element='<LogType>"1125-KKKK"</LogType>' 
Element='<LogType>"1125-KKKK"</LogType>' 
Element='<LogType>"1125-KKKK"</LogType>' 

但是它只是讓我在鼠洞。我現在如何退後一步,爲每個符合我所需要的LogType事件獲取IncidentDetail文本?是否有一些多步驟的過程?

任何協助讚賞。

回答

0

而是在主軸步進到Log/LogType的,你可以把它看成謂詞是這樣的:

//Dispatch[@ID='JJJJ'][Log/LogType[contains(.,'KKKK')]] 

或另一種方式:

//Dispatch[@ID='JJJJ' and Log/LogType[contains(.,'KKKK')]] 

從這裏,你可以輕鬆地繼續主軸得到IncidentDetail而不必向後退:

/Log/LogDetails/details/IncidentDetail 

關於更新:

您可以添加過濾器或者通過使用XPath索引只得到相同的父內的第一IncindentDetail

/Log/LogDetails/details/IncidentDetail[1] 

或過濾由節點的文本內容:

/Log/LogDetails/details/IncidentDetail[contains(.,'[1]') 
+0

好的,這幾乎讓我在那裏。我現在有: //發送[@ ID ='JJJJ'和Log/LogType [contains(。,'KKKK')]和Log/LogDetails/details/IncidentDetail [contains(。,'[1]')] ] // LogDetails/details/IncidentDetail 問題是,這不會在最後的'[1]'條件上過濾。請注意,我剛纔添加了第三個過濾條件,因爲我只需要包含[1]的IncidentDetails,表示它是第一個特殊類型,如果這是有意義的(即不是事件更新)。 想法? –

+0

你是不是指像' [1] .. bla..bla ..'簡單地說是第一個''節點?如果你的意思是後者,那麼它應該是:'...../IncidentDetail [1]'而不是 – har07

+0

是的,這就是我的意思。我已經嘗試了你剛纔描述的內容,但它仍然沒有針對這種情況進行過濾。真令人費解。典型的是這樣的: 「[1] BLK BLK KKKS SKJDFHJH ETC」 而且經常有多個這樣的更新,按順序編號,但我只是想第一個。無法獲得...../IncidentDetail [1]來篩選該條件。 感謝您的幫助。我會繼續修補。 –

0

嘗試//Dispatch[@ID='JJJJ']//Log/LogType[contains(.,'KKKK')]//IncidentDetail