Проблема: попытка создать правильный XPATH с использованием Spel xpath для корреляции с тегом «Имя», где корневой тег имеет пространство имен, но без префикса.Spring Spel Выражение XPATH для пространства имен, но без префикса
Ошибка: Неожиданный токен. Ожидаемый 'rparen())' but was 'identifier' Жаловаться на & # 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()]='Name'/text()')"
release-strategy="blah"
release-strategy-method="timeToRelease"
send-partial-result-on-expiry="false"
send-timeout="60000"
group-timeout="60000"
/>
Update:
Таким образом, после загрузки источника весной и трассировку вопрос. Похоже, что во время выполнения токенизации в приведенном ниже методе Spring обрабатывает «Имя» как идентификатор, а не как часть строкового литерала. По крайней мере, это разница между рабочим экземпляром и неудавшимся экземпляром. Вероятно, я не избегаю его.
Класс: 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)]
Дополнительные Debug Примечания:
При вытаскивании пружинный мерзавца здесь:
https://github.com/spring-projects/spring-framework
- Возьмите все проекты.
- В корне находится «import = in-eclipse.bat» или «import-into-idea», который я не видел. Вы можете выполнить это, чтобы полностью построить и проверить все, что вам нужно, и импортировать проекты, чтобы вы могли проследить проблему.
Я попробовал и выше, и я до сих пор получил тот же ошибка. Я знаю, что это, наверное, что-то маленькое, которого я не хватает. Попытка найти выражение xpath весной, которое использует local-name(), но пока еще не нашло примера. – haju
Я был прав на две одинарной цитаты. Я испортил копию и вставку, чтобы попытаться и не понял, пока не проследил проблему в процессе Tokenization весной. Тьфу. О, ну очень интересно проследить. – haju