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

Spring int xml:带节点函数的xpath表达式错误

宋铭
2023-03-14

我使用XMLSpy编写了以下XPath来确定最长字符串长度,它在XMLSpy中工作:

string-length(//exception:ElementMessageAbcException/@exceptionMsg[not(string-length(.) < //exception:ElementMessageAbcException/@exceptionMsg/string-length(.))] )

但是当我在spring integration中将相同的字符串放入xpath-expression时,它会出错:

org.springframework.beans.factory.BeanCreationException:创建名为xpath MaxLengthExceptionMsg的bean时出错:bean实例化失败;嵌套异常org.springframework.beans.factory.BeanDefinitionStoreException:工厂方法[公共静态org.springframework.xml.xpath.XPathExpressionorg.springframework.xml.xpath.XPathExpressionFactory.createXPathExpression(java.lang.String,java.util.Map)抛出java.lang.IllegalStateException,org.springframework.xml.xpath.XPathParseException]抛出异常;嵌套异常org.springframework.xml.xpath.XPathParseException:无法编译[//异常:MarkitMessageAciException/@Exception Msg[not(string-long()

<int-xml:xpath-expression id="xpathMaxLengthExceptionMsg" expression="//exception:ElementMessageAciException/@exceptionMsg[not(string-length(.) &lt; //exception:ElementMessageAciException/@exceptionMsg/string-length(.))]">
    <map>
        <entry key="pricing" value="http://www.example.net/imdwrd/schemas/Element-pricing-aci" />
        <entry key="security" value="http://www.example.net/imdwrd/schemas/Element-security-aci" />
        <entry key="tns" value="http://www.example.net/imdwrd/schemas/Element-message-aci" />
        <entry key="internalClassification" value="http://www.example.net/imdwrd/schemas/Element-internal-classification" />
        <entry key="organization" value="http://www.example.net/imdwrd/schemas/Element-organization-aci" />
        <entry key="exception" value="http://www.example.net/imdwrd/schemas/Element-message-aci-exception"/>
        <entry key="xsi" value="http://www.w3.org/2001/XMLSchema-instance" />
    </map>
</int-xml:xpath-expression>

示例XML:

<?xml version="1.0" encoding="UTF-8"?>
<confirm:ElementMessageAbcConfirm
  confirmTs="2014-10-14T11:43:36.191-05:00"
  correlationId="ORG-1008891250014" numberAccepted="0"
  numberRejected="1" status="exception"
  xmlns:ack="http://www.example.net/imdwrd/schemas/Element-message-Abc-ack"
  xmlns:confirm="http://www.example.net/imdwrd/schemas/Element-message-Abc-confirm"
  xmlns:event="http://www.example.net/imdwrd/schemas/data-source-event"
  xmlns:exception="http://www.example.net/imdwrd/schemas/Element-message-Abc-exception"
  xmlns:internalClassification="http://www.example.net/imdwrd/schemas/Element-internal-classification"
  xmlns:ns9="http://www.example.net/imdwrd/schemas/Element-message-Abc"
  xmlns:organization="http://www.example.net/imdwrd/schemas/Element-organization-Abc"
  xmlns:pricing="http://www.example.net/imdwrd/schemas/Element-pricing-Abc" xmlns:security="http://www.example.net/imdwrd/schemas/Element-security-Abc">
  <exception:ElementMessageAbcException exceptionCode="1000"
    exceptionMsg="[property]=Organization [message]=Organization information has not changed.  Update request has been cancelled."
    exceptionType="informational" id="385059141722030" type="organization"/>
 <exception:ElementMessageAbcException exceptionCode="1000"
    exceptionMsg="[property]=Organization [message]=Organizatiosn information has not changed.  Update request has been cancelled. longer"
    exceptionType="informational" id="385059141722030" type="organization"/>    
</confirm:ElementMessageAbcConfirm>

共有1个答案

汪正卿
2023-03-14

我不知道XML Spy是如何工作的,但我看到这个:

/@exceptionMsg/string-length(.)

是错误的语法。string-long()实际上是一个xPath函数,但它不是XML的节点。

现在还不清楚你的目标是什么,但我希望它能帮助你走上正确的道路。

更新

好吧,我已经弄清楚发生了什么。

您使用XPath 2(如何使用XPath选择具有最长子#文本节点值的XML节点?),但默认情况下Java没有这种能力。

所以你应该使用其他的库。萨克森是这方面最好的。

但是,您应该这样做:

-Djavax.xml.xpath.XPathFactory:http://java.sun.com/jaxp/xpath/dom=net.sf.saxon.xpath.XPathFactoryImpl

或者以编程方式指定该系统属性。

 类似资料:
  • 我在看w3c书店xpath的例子。 基于xml: 我正在尝试使用XPath实现这一点: “这个XML文档是否有一本作者为‘詹姆斯·麦戈文’、价格为‘49.99’的书,这个XML文档是否也有一本作者为‘埃里克·雷’、价格为‘39.95’的书 人类的说法是正确的,XPath等效的是什么?是否可以跨兄弟节点运行表达式,如果可以,如何运行? 为了澄清,在其他语言中,可以这样做: 其中author1\pri

  • 主要内容:示例XPath表达式通常定义模式以便选择一组节点。 这些模式由XSLT用于执行转换,或者由用于寻址。 XPath规范指定了七种类型的节点,这些节点可以是XPath表达式的执行输出。 根 元素 文本 属性 注释 处理指令 命名空间 XPath使用路径表达式从XML文档中选择节点或节点列表。 以下是从XML文档中选择节点/节点列表的路径和表达式列表。 序号 表达式 描述 1 选择具有给定名称的所有节点。

  • 问题内容: 我需要一个正则表达式 那么任何数字。并再次编号和。 所以这是有效的 但 无效 我尝试了以下模式: 但这些都不满足我的要求。请帮忙? 我现有的代码是 问题答案: 这样的事情应该起作用: 编辑 是的,不从该描述,如果最终清除被允许(假定一个初始是 不 )。 如果不: 或者 (如果看起来更合乎逻辑) 测试 产生:

  • 在 JavaScript 中,函数不是“神奇的语言结构”,而是一种特殊的值。 我们在前面章节使用的语法称为 函数声明: function sayHi() { alert( "Hello" ); } 另一种创建函数的语法称为 函数表达式。 通常会写成这样: let sayHi = function() { alert( "Hello" ); }; 在这里,函数被创建并像其他赋值一样,被明确地

  • 在本章中,我们将详细介绍XPath表达式,其中包括常见的节点类型,XPath定义和句柄。 序号 节点类型 描述 1 Root XML文档的根元素节点。 2 Element 元素节点。 3 Text 元素节点的文本。 4 Attribute 元素节点的属性。 5 Comment 注释

  • 我已经掌握了XPath的基本知识,但在确定以下内容是否可以在使用XPath的C代码中实现时遇到了一些困难(或者我是否需要将其转移到其他代码中,正如我目前所做的那样)。 我有一个XML文档,它由以下结构组成: 其中有多个设置参数值。现在我需要做的只是检索那些包含name属性某些值的setParameter节点。我可能有这些值的可能匹配列表,但它们不会是完全匹配,它们将是节点的name属性必须包含的值