如何使用XPath检查XML中是否存在元素?

2022-08-31 16:39:49

下面是我的元素层次结构。如何检查(使用 XPath)附加的 Xml 元素是否存在于使用者信用报告

<Consumers xmlns="http://xml.mycompany.com/XMLSchema">
       <Consumer subjectIdentifier="Primary">
          <DataSources>
               <Credit>
                   <CreditReport>
                      <AttachedXml><![CDATA[ blah blah]]>

答案 1

使用布尔值() XPath 函数

布尔函数将其参数转换为布尔值,如下所示:

  • 当且仅当一个数字既不是正零也不是负零,也不是 NaN 时,它才为真

  • 当且仅当节点集为非空时为真

  • 当且仅当字符串的长度不为零时,该字符串为真

  • 四种基本类型以外的类型的对象将以依赖于该类型的方式转换为布尔值

如果主要消费者信用报告中存在附加的Xml,则它将返回 。true()

boolean(/mc:Consumers
          /mc:Consumer[@subjectIdentifier='Primary']
            //mc:CreditReport/mc:AttachedXml)

答案 2

Saxon 文档虽然有点不清楚,但似乎表明,如果未找到匹配的节点,JAXP XPath API 将在评估 XPath 表达式时返回。false

这篇 IBM 文章提到了没有匹配节点时的返回值。null

您可能需要基于此API稍微尝试一下返回类型,但基本思想是您只需运行正常的XPath并检查结果是否为节点/ / /等。falsenull

XPathFactory xpathFactory = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);
XPath xpath = xpathFactory.newXPath();
XPathExpression expr = xpath.compile("/Consumers/Consumer/DataSources/Credit/CreditReport/AttachedXml");
Object result = expr.evaluate(doc, XPathConstants.NODE);

if ( result == null ) {
    // do something
}

推荐