2015-09-30 96 views
0

我需要過濾SOAP Web服務的響應。由於SOAP基於XML,因此我正在考慮使用libxml2,但我無法理解如何編寫XPath表達式來實現所需的結果。使用基於子元素內容的XPath過濾XML

在消息結尾處,您會看到一個響應示例,其中發送了兩個NotficationMessages,其中一個主題爲tns1:RuleEngine/LineDetector/Crossed,另一個主題爲tns1:RuleEngine/CellMotionDetector/Motion

我想寫以下XPath表達式:

  • 比賽,其主題是tns1:RuleEngine/LineDetector/Crossed
  • 比賽,其主題是tns1:RuleEngine//.
  • 比賽,其主題是一切,但tns1:RuleEngine//.
  • 任何NotficationMessage任何NotficationMessage任何NotficationMessage

我發現的所有例子都與屬性匹配,而不是ch的內容ild元素。

所以我問。

  1. 這種類型的匹配可以在libxml2或XPath中使用嗎?
  2. 你能給我一個關於編寫XPath表達式的提示嗎?
<?xml version="1.0" encoding="UTF-8"?> 
    <SOAP-ENV:Envelope 
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" 
    xmlns:wsa="http://www.w3.org/2005/08/addressing" 
    xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" 
    xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" 
    xmlns:tet="http://www.onvif.org/ver10/events/wsdl" 
    xmlns:tns1="http://www.onvif.org/ver10/topics" 
    xmlns:tt="http://www.onvif.org/ver10/schema"> 
    <SOAP-ENV:Header> 
     <wsa:Action> http://www.onvif.org/ver10/events/wsdl/PullPointSubscription/PullMessagesResponse 
     </wsa:Action> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <tet:PullMessagesResponse> 
     <tet:CurrentTime> 
      2008-10-10T12:24:58 
     </tet:CurrentTime> 
     <tet:TerminationTime> 
      2008-10-10T12:25:58 
     </tet:TerminationTime> 
     <wsnt:NotificationMessage> 
      <wsnt:Topic Dialect="http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet"> 
      tns1:RuleEngine/LineDetector/Crossed 
      </wsnt:Topic> 
      <wsnt:Message> 
      <tt:Message UtcTime="2008-10-10T12:24:57.321Z"> 
       <tt:Source> 
       <tt:SimpleItem Name="VideoSourceConfigurationToken" 
           Value="1"/> 
       <tt:SimpleItem Name="VideoAnalyticsConfigurationToken" 
           Value="2"/> 
       <tt:SimpleItem Value="MyImportantFence1" Name="Rule"/> 
       </tt:Source> 
       <tt:Data> 
       <tt:SimpleItem Name="ObjectId" Value="15" /> 
       </tt:Data> 
      </tt:Message> 
      </wsnt:Message> 
     </wsnt:NotificationMessage> 
     <wsnt:NotficationMessage> 
      <wsnt:Topic Dialect="http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet"> 
      tns1:RuleEngine/CellMotionDetector/Motion 
      </wsnt:Topic> 
      <wsnt:Message> 
      <tt:Message UtcTime= "2010-10-20T12:24:57.628"> 
       <tt:Source> 
       <tt:SimpleItem Name="VideoSourceConfigurationToken" Value="1"/> 
       <tt:SimpleItem Name="VideoAnalyticsConfigurationToken" Value="1"/> 
       <tt:SimpleItem Name="Rule" Value="MotionInDefinedCells"/> 
       </tt:Source> 
       <tt:Data> 
       <tt:SimpleItem Name="IsMotion" Value="true"/> 
       </tt:Data> 
      </tt:Message> 
      </wsnt:Message> 
     </wsnt:NotficationMessage> 
     </tet:PullMessagesResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

回答

0

所有你需要的是使用location pathspredicates基本XPath表達式:

  1. 比賽,其主題是tns1:RuleEngine/LineDetector/Crossed

    //wsnt:NotificationMessage[wsnt:Topic = 'tns1:RuleEngine/LineDetector/Crossed'] 
    
  2. 比賽,其主題是tns1:RuleEngine//.任何NotficationMessage任何NotficationMessage

    //wsnt:NotificationMessage[wsnt:Topic = 'tns1:RuleEngine//.'] 
    
  3. 匹配任何NotficationMessage,其主題是一切,但tns1:RuleEngine//.

    //wsnt:NotificationMessage[wsnt:Topic != 'tns1:RuleEngine//.']