2013-04-05 9 views
4

Я пытаюсь выбрать текстовые узлы элемента Lookup.Result из следующего XML-документа с использованием XPath на сервере Sql.Выберите узлы xml с точкой в ​​имени с помощью XPath

<Commands> 
<Command id="1"> 
<Lookup.Result>Result.OK</Lookup.Result> 
</Command> 
</Commands> 

Я пытаюсь следующий запрос:

declare @xml xml 
set @xml = '<Commands> 
    <Command id="1"> 
    <Lookup.Result>Result.OK</Lookup.Result> 
    </Command> 
    </Commands> 
' 
select t.c.value('./Lookup&#46;Result/text()[1]', 'varchar(20)') 
from @xml.nodes('/Commands/Command') t(c) 

, но я получаю следующее сообщение об ошибке: XQuery [значение()]: ошибка синтаксиса около 'Поиск'

Как я могу избежать. (точка в имени тега Lookup.Result) в выражении XPath? Пожалуйста, помогите найти элегантное решение этой проблемы. Заранее благодарю вас за ваше время.

ответ

3
declare @xml xml 
    set @xml = '<Commands> 
    <Command id="1"> 
    <Lookup.Result>Result.OK</Lookup.Result> 
    </Command> 
    </Commands> ' 

    select t.c.value('(./Lookup.Result/text())[1]', 'varchar(20)') 
    from @xml.nodes('/Commands/Command') t(c) 

вам не хватает

()

вокруг выше XPath, MSSQL обрабатывает. отлично на моей машине

+0

Вы правы. Есть так много комбинаций при отладке, что я обрезал круглые скобки в одном из них ... :)) Теперь он работает. Может показаться, что точка всегда интерпретируется как текущий узел, но кажется, что в некоторых ситуациях это считается просто текстом. Спасибо. – Vakho

+0

@ пользователь2248972 без проблем. Вы можете пометить ответ как принятый, если хотите. – Filip

0

Ну есть только 5 побег символы:

" &quot; 
' &apos; 
< &lt; 
> &gt; 
& &amp; 

так что вам нужна функция для предобработки то и другое, чтобы отправлять процесс. то есть обертка 5 вложенными REPLACE заявления в UDF ...

Смежные вопросы