Spring Spel XPATH Expression for Namespace但没有前缀

时间:2016-02-02 01:38:43

标签: spring xpath spring-el

问题:尝试使用SpEL xpath构建正确的XPATH,以关联“名称”标记值,其中根标记具有命名空间但没有前缀。

错误:意外的令牌。预期'rparen())'但是'标识符' 它在抱怨& #39;我试图为xpath评估做一个单引号。

XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns="http://www.foo.com">
<id></id>
<Name>test</Name>
</root>

Spring Config

<aggregator 
    id="agg1" 
    input-channel="requestChannel"
    output-channel="outputChannel" 
    discard-channel="garbageCanChannel"
    ref="blah" 
    method="combine"
    expire-groups-upon-completion="true"
    correlation-strategy-expression="#xpath(payload, '//*[local-name()]=&#39;Name&#39;/text()')"
    release-strategy="blah"
    release-strategy-method="timeToRelease"
    send-partial-result-on-expiry="false"
    send-timeout="60000"
    group-timeout="60000"
    />

更新

所以在下载spring source并跟踪问题之后。似乎在下面方法中的标记化执行期间,Spring将“Name”视为标识符而不是字符串文字的一部分。至少这是工作实例和失败实例之间的区别。大概可能我没有正确地逃避它。

类别:InternalSpelExpressionParser.java 方法:doParseExpression

this.expressionString = "#xpath(payload, '//*[local-name()=Name]')"//This works
[[HASH(#)](0,1), [IDENTIFIER:xpath](1,6), [LPAREN(()](6,7), [IDENTIFIER:payload](7,14), [COMMA(,)](14,15), [LITERAL_STRING:'//*[local-name()=Name]'](16,45), [RPAREN())](45,46)]


this.expressionString = "#xpath(payload, '//*[local-name()='Name']')"//Thisfails
[[HASH(#)](0,1), [IDENTIFIER:xpath](1,6), [LPAREN(()](6,7), [IDENTIFIER:payload](7,14), [COMMA(,)](14,15), [LITERAL_STRING:'//*[local-name()='](16,35), [IDENTIFIER:Name](35,44), [LITERAL_STRING:']'](44,47), [RPAREN())](47,48)]

解决方案: ...

correlation-strategy-expression="#xpath(payload, '//*[local-name()=''Name'']/text()')"

正确的字符串文字: - 您可以看到它现在是正确的,因为标记化过程将所有内容放在字符串文字标记中。

[[HASH(#)](0,1), [IDENTIFIER:xpath](1,6), [LPAREN(()](6,7), [IDENTIFIER:payload](7,14), [COMMA(,)](14,15), [LITERAL_STRING:'//*[local-name()=''Name'']/text()'](16,56), [RPAREN())](56,57)]

其他调试说明:

在这里拉出弹簧棒时:

https://github.com/spring-projects/spring-framework

  1. 完成所有项目。
  2. 根部是“import = into-eclipse.bat”或“import-into-idea”,我没看到。您可以执行该操作以在本地完全构建和签出所需的所有内容并导入项目,以便跟踪问题。

1 个答案:

答案 0 :(得分:0)

您发布的表达式将产生无效的XPath。它应该在/text()之前关闭方括号:

'//*[local-name()=&#39;Name&#39;]/text()'

可能使用双单引号转义,如建议here

'//*[local-name()=''Name'']/text()'