首页 文章

使用XPath根据子元素的内容过滤XML

提问于
浏览
0

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

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

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

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

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

  • 匹配任何NotficationMessage,其主题是除了 tns1:RuleEngine//. 之外的所有内容

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

所以我问 .

  • 这种匹配是否可以与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>

1 回答

  • 0

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

    • 匹配其主题为 tns1:RuleEngine/LineDetector/Crossed 的任何NotficationMessage
    //wsnt:NotificationMessage[wsnt:Topic = 'tns1:RuleEngine/LineDetector/Crossed']
    
    • 匹配任何NotficationMessage,其主题是 tns1:RuleEngine//.
    //wsnt:NotificationMessage[wsnt:Topic = 'tns1:RuleEngine//.']
    
    • 匹配任何NotficationMessage,其主题是除了 tns1:RuleEngine//. 之外的所有内容
    //wsnt:NotificationMessage[wsnt:Topic != 'tns1:RuleEngine//.']
    

相关问题