我需要过滤SOAP Web服务的响应。由于SOAP基于XML,因此我正在考虑使用libxml2,但是我无法理解如何编写XPath表达式来实现所需的结果。

在消息末尾,您将找到一个响应示例,其中发送了两个NotficationMessage,一个主题为tns1:RuleEngine/LineDetector/Crossed,另一个主题为tns1:RuleEngine/CellMotionDetector/Motion

我正在尝试编写以下XPath表达式:


匹配任何主题为tns1:RuleEngine/LineDetector/Crossed的NotficationMessage
匹配任何主题为tns1:RuleEngine//.的NotficationMessage
匹配任何主题为tns1:RuleEngine//.以外的所有NotficationMessage


我发现的所有示例都匹配属性,而不是子元素的内容。

所以我问。


这种匹配是否可以与libxml2或XPath一起使用?
您能给我一些有关编写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>

最佳答案

您只需要使用location pathspredicates的基本XPath表达式即可:


匹配任何主题为tns1:RuleEngine/LineDetector/Crossed的NotficationMessage

//wsnt:NotificationMessage[wsnt:Topic = 'tns1:RuleEngine/LineDetector/Crossed']

匹配任何主题为tns1:RuleEngine//.的NotficationMessage

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

匹配任何主题为tns1:RuleEngine//.以外的所有NotficationMessage

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

关于c - 根据子元素的内容使用XPath过滤XML,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32863759/

10-11 15:29