2016-02-02 4 views
0

Проблема: попытка создать правильный 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()]=&#39;Name&#39;/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

  1. Возьмите все проекты.
  2. В корне находится «import = in-eclipse.bat» или «import-into-idea», который я не видел. Вы можете выполнить это, чтобы полностью построить и проверить все, что вам нужно, и импортировать проекты, чтобы вы могли проследить проблему.

ответ

0

Ваше выражение, опубликованное, приведет к недействительному XPath. Она должна закрывать квадратные скобки как раз перед /text() вместо:

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

Или возможно используя двойные одинарные кавычки, чтобы избежать, как это было предложено here:

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

Я попробовал и выше, и я до сих пор получил тот же ошибка. Я знаю, что это, наверное, что-то маленькое, которого я не хватает. Попытка найти выражение xpath весной, которое использует local-name(), но пока еще не нашло примера. – haju

+0

Я был прав на две одинарной цитаты. Я испортил копию и вставку, чтобы попытаться и не понял, пока не проследил проблему в процессе Tokenization весной. Тьфу. О, ну очень интересно проследить. – haju