当前位置: 首页 > 知识库问答 >
问题:

Xpath:检查节点是否不存在

郭元凯
2023-03-14

我从我的网络商店API调用中获取XML,其结构非常像下面的示例:

<Customers>
<Customer>
    <Username>userOne</Username>
    <Params>
        <Param>
            <Id>111</Id>
            <Name>Param1</Name>
            <Value><![CDATA[Param 1 is on]]></Value>
        </Param>
        <Param>
            <Id>112</Id>
            <Name>Param2</Name>
            <Value><![CDATA[OFF]]></Value>
        </Param>
    </Params>
</Customer>
<Customer>
    <Username>userTwo</Username>
    <Params>
        <Param>
            <Id>111</Id>
            <Name>Param1</Name>
            <Value><![CDATA[Param 1 is on]]></Value>
        </Param>
        <Param>
            <Id>112</Id>
            <Name>Param2</Name>
            <Value><![CDATA[OFF]]></Value>
        </Param>
    </Params>
</Customer>
<Customer>
    <Username>userThree</Username>
    <Params>            
        <Param>
            <Id>112</Id>
            <Name>Param2</Name>
            <Value><![CDATA[ON]]></Value>
        </Param>
    </Params>
</Customer>

其中有更多的参数,数量取决于许多外部因素。我正在尝试获取用户名,当id“111”和id“112”的值是我要查找的值时Customers/Customer[Params/Param[Id/text()='111']/Value/text()='Param 1打开][Params/Param[Id/text()='112']/Value/text()='OFF']/Username/text()

上述代码按预期返回“userOne”和“userTwo”。

问题是,Id“111”要么有值“Param 1 is on”要么什么都没有,如果没有值,它就不会显示在XML中。所以我需要一个表达式来检查id为“111”的节点是否不存在,id为“112”的值是否为“ON”。

不幸的是,Xpath对我来说真的很新,我无法找到一种方法来具体检查节点是否不存在。

共有2个答案

扈沛
2023-03-14

XPathcount(expr)可用于检查是否存在条件

Customers/Customer[count(Params/Param[Id/text()='111' and Value/text()='Param 1 is on']) = 0 and Params/Param[Id/text()='112']/Value/text()='ON']/Username/text()

因此,这一部分检查该节点是否不存在计数(Params/Param[Id/text()='111'和Value/text()='Param 1在'])=0
或计数(Params/Param[Id/text()='111')=0

并且这部分检查其他预期条件
Params/Param[Id/text()='112']/Value/text()='ON'

应用于样本返回:
userThree

苏鸿志
2023-03-14

根据定义,当强制转换为布尔值时,节点集为true,并且只有当它包含元素时才为true(https://www.w3.org/TR/xpath-31/#dt-ebv)。这样,值元素的存在性检查可以如下所示

fn:boolean(Customers/Customer[Params/Param[Id/text()='111']/Value)

或者如果你想把它作为第三种选择包括在你的支票里

Customers/Customer[Params/Param[Id/text()='111' and not ./Value]
 类似资料:
  • 我有一种感觉,我在这件事上完全错了。但无论如何。 我有一个sql数据库,它本质上是一个有目的的非规范化表,我构造这个表是为了使这项任务对我来说更容易,所以我可以从一个表中获取内容。 我有一张成双成对的桌子,像这样: 等等 所以对于我的neo4j图数据库,我希望每个用户ID作为一个节点,其他的东西不是太重要,但基本上是关系中的东西。 我只希望每个用户有一个节点,所以我的感觉是,如果我这样做: 当我们

  • 调用web3.eth.isMining()方法来检查节点是否在进行挖矿。 调用: web3.eth.isMining([callback]) 返回值: 一个Promise对象,挖矿时其解析值为true,否则为false。 示例代码: web3.eth.isMining().then(console.log); > true

  • 问题内容: 如何使用Node的驱动程序检查ObjectID是否有效 我试过了 : 但是我不断收到异常,而不是对或错。(例外只是一个“ throw e; // process.nextTick错误,或“第一次滴答”中的“ error”事件” 问题答案: 不知道函数来自哪里,但是不在node-mongodb- native中 。 如果要检查由24个十六进制字符组成的字符串,则可以使用此正则表达式。 取

  • web3.eth.isSyncing()方法用来检查节点当前是否已经与网络同步。 调用: web3.eth.isSyncing([callback]) 返回值: 一个Promise对象,其解析值为Object或Boolean。如果节点尚未与网络同步, 则返回false,否则返回一个同步对象,具有以下属性: startingBlock - Number: 同步起始块编号 currentBlock

  • 我正在处理一个Spring BootNeo4j应用程序 在保存新密码之前,如何编写自定义密码来检查Priviledge是否存在 UserRole域:@NodeEntity公共类UserRole{ 特权域:

  • 问题内容: 我有一个非常简单的程序,你可以用你的,, ,和键进行拍摄。所有的拍摄和移动动画都可以工作,但是我不确定如何实现一个系统,在该系统中,程序会不断检查子弹是否已碰到节点(例如圆圈)。 我本以为可以存储所有项目符号,然后使用来检查项目符号是否接触到节点;但是我觉得那样会减慢程序的速度,并且子弹可以在等待再次执行时通过它们。 任何建议都会有所帮助。 代码:Pastebin 问题答案: 您可以使