2015-09-30 5 views
0

Мне нужно отфильтровать ответ веб-службы SOAP. Поскольку SOAP основан на XML, я думаю об использовании libxml2, но я не могу понять, как написать выражение XPath для достижения желаемого результата.Фильтрация XML с помощью XPath на основе содержимого дочерних элементов

В конце сообщения вы найдете пример ответа, в котором отправляются два сообщения NotficationMessages, есть тема tns1:RuleEngine/LineDetector/Crossed, другая - тема tns1:RuleEngine/CellMotionDetector/Motion.

Я пытаюсь написать следующие XPath выражения:

  • матч любой NotficationMessage чья тема tns1:RuleEngine/LineDetector/Crossed
  • матч любой NotficationMessage чья тема tns1:RuleEngine//.
  • матч любой NotficationMessage, тема которого есть все, но tns1:RuleEngine//.

Все примеры, которые я нашел, соответствуют атрибутам, а не содержимому 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

Все, что вам нужно, это основные XPath выражения с использованием location paths и predicates:

  1. матч любой NotficationMessage чья тема tns1:RuleEngine/LineDetector/Crossed

    //wsnt:NotificationMessage[wsnt:Topic = 'tns1:RuleEngine/LineDetector/Crossed'] 
    
  2. матч любой NotficationMessage чья тема tns1:RuleEngine//.

    //wsnt:NotificationMessage[wsnt:Topic = 'tns1:RuleEngine//.'] 
    
  3. матч любой NotficationMessage, тема которого есть все, но tns1:RuleEngine//.

    //wsnt:NotificationMessage[wsnt:Topic != 'tns1:RuleEngine//.'] 
    
Смежные вопросы