XQL检查所有子节点的值

时间:2017-04-25 12:16:09

标签: xml xpath

我有以下XML:

<?xml version="1.0" encoding="UTF-8" ?>
<Ticket>
<PlannedTraffic>
    <Action>
        <Value>Allow</Value>
    </Action>
    <Destination>
        <Value>*</Value>
    </Destination>
    <ServiceApplication>
        <Value>tcp/80</Value>
    </ServiceApplication>
    <Source>
        <Value>10.130.5.5</Value>
    </Source>
    <ABF_flow_comment>Subscribe value</ABF_flow_comment>
</PlannedTraffic>
<PlannedTraffic>
    <Action>
        <Value>Allow</Value>
    </Action>
    <Destination>
        <Value>*</Value>
    </Destination>
    <ServiceApplication>
        <Value>tcp/22</Value>
    </ServiceApplication>
    <ServiceApplication>
        <Value>tcp/21</Value>
    </ServiceApplication>
    <Source>
        <Value>10.130.5.17</Value>
    </Source>
    <ABF_flow_comment>Comment with the word subscribe</ABF_flow_comment>
</PlannedTraffic>
</Ticket>

使用XQL我需要检查是否所有包含单词&#34; Subscribe&#34;。如果所有这些都包含单词subscribe,则返回true或所有节点。如果其中一个或多个不包含单词subscribe,我需要它返回false或什么都不是。 哪个XQL可用于此?

我尝试过以下操作,但它只返回值为&#34;订阅&#34;并且我无法检测是否只有一个节点不包含它。我想我需要一些带count()然后与节点数量进行比较,但我不确定如何进行XQL查询

Ticket/PlannedTraffic[ABF_flow_comment =~ '/[sS]ubscribe/']

2 个答案:

答案 0 :(得分:1)

为什么不

not(Ticket/PlannedTraffic[not(contains(ABF_flow_comment, 'ubscribe'))])

只有在true没有PlannedTraffic

的情况下才会返回ABF_flow_comment

答案 1 :(得分:0)

不完全熟悉语法,我可以告诉你我将如何完成它。我将为所有节点创建一个XPath,无论订阅状态如何:

订票/ PlannedTraffic

然后我会比较XPath返回项的计数与上面使用XPath返回的总项数。如果它们是相同的,那么所有都是订阅的。在Java中使用Selenium我会使用:

int totNodes = driver.FindElements(By.XPath("//Ticket/PlannedTraffic").size();
int subNodes = driver.FindElements(By.XPath("//Ticket/PlannedTraffic[contains(@ABF_flow_comment,"ubscribed")]").size();
Boolean isAllSubscribed = (totNodes == subNodes);

希望这有助于至少为您指明方向。