gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:10:27 26 4
gpt4 key购买 nike

我需要过滤 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。

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

所以我才问。

  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>

最佳答案

您所需要的只是使用 location paths 的基本 XPath 表达式。和 predicates :

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

    //wsnt:NotificationMessage[wsnt:Topic = 'tns1:RuleEngine/LineDetector/Crossed']
  2. 匹配主题为 tns1:RuleEngine//的任何 NotficationMessage。

    //wsnt:NotificationMessage[wsnt:Topic = 'tns1:RuleEngine//.']
  3. 匹配主题为除 tns1:RuleEngine//之外的所有内容的任何 NotficationMessage。

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com