2011-02-10 6 views
-1

Я вношу изменения в веб-приложение с помощью XPath, и при его выполнении появляется сообщение об ошибке - Недопустимый токен!Недействительный токен при использовании XPath

Это основное, что я делаю

public xmlNode GetSelection (SelectParams params, xmldocument docment) 

{ 

    xpathstring = string.format("Name =\'{0}' Displaytag = \'{1}' Manadatory=\'{2}', params.Name, params.Displaytag, params.Manadatory); 

    return document.selectsinglenode(xpathstring); 

} 

Как вы можете видеть, я делаю строку и установка значений на узлах я пытаюсь найти против моего XML-документа, и, таким образом, возвращает данные XML, которые соответствует моим параметрам.

Что происходит, я получаю ошибку xpathexeception в Visual Studio и говорит недействительный токен.

Я знаю, что в документе xml параметры, которые я ищу в тегах, имеют двойные кавычки, например, Name = "ABC". Итак, я думал, что проблема может быть решена с помощью «\».

Может ли кто-нибудь помочь?

Обновление от комментариев

В XML-документе, тег имеет атрибуты, где они устанавливаются в качестве Name = "ABC" Displaytag = "Atag" =, обязательные "истинный".

+0

Плохой вопрос от одного, кто не принял ни одного из прошлых ответов. Заслуженный -1. – Flack

+0

Если вам нужно выражение XPath, вы должны предоставить уменьшенный входной образец. –

ответ

0

Я думаю, что вам нужно:

//*[@Name="ABC"][@Displaytag="ATag"][@Manadatory="true"] 

Или

//*[@Name="ABC" and @Displaytag="ATag" and @Manadatory="true"] 

Значение: любой элемент всего документа, имеющего атрибут Name со значением "ABC", атрибут Displaytag с " ATag "и атрибут Manadatory с" истинным "значением.

+0

В строковом формате мне нужно было бы построить его следующим образом: string.format ("// * [@ Name, {0}] [@ Displaytag, {1}] [@ Manadatory, {2}], params. Имя, params.Displaytag, params.Manadatory), будет ли это работать? – Andy5

+0

@ Andy5: Почему вы не видите оператор '=' сравнения? –

+0

Я основываюсь на этом примере: http://stackoverflow.com/questions/1787439/ xpath-c-throw-an-exception-namespace-manager-or-xsltcontext-need. Если это неправильно или если у вас есть лучший способ сделать это, то, пожалуйста, покажите мне, что вы имеете в виду? – Andy5

0

Строка, передаваемая в качестве аргумента SelectSingleNode() (Кстати, точная капитализация является важным) является что-то вроде:

Name ='someName' Displaytag = 'someString' Manadatory='true' 

Это чрезвычайно отличается, чем выражение синтаксически правовой XPath.

И сообщение об ошибке просто отражает тот факт, что токсичные продукты были переданы двигателю XPath.

Решение: прочитайте хотя бы легкий учебник по XPath, а затем укажите правильное выражение XPath.

+0

Хотя я ценю ваш комментарий к selectsinglenode(), но это потому, что я набираю его и в коде правильно заглавны! – Andy5

+0

В документе Xml тег имеет атрибуты, в которых они установлены как Name = "ABC" Displaytag = "ATag" Manadatory = "true". Итак, я не уверен, что вы здесь не говорите? «Проблема»? – Andy5

+0

@ Andy5: Читайте хорошо ... R E A D. , , –

0

Строка, которую вы строите, не является допустимым выражением XPath. Фактически, это совсем не похоже на XPath.

Действительно, даже если это было допустимое выражение XPath, его построение путем конкатенации строк является очень опасной практикой из-за возможности инъекционных атак. Но я подозреваю, что совет упадет на каменистую почву.

+0

Просто из любопытства, как бы вы рекомендовали защитить от инъекционных атак при определении XPath из параметров? – Flynn1179

+1

Не все API-интерфейсы XPath позволяют это, но когда это возможно, используйте выражение XPath с параметром ams: // x [@ key = $ value], затем из вызывающей среды, xpath.setParameter (значение, 'fried chicken'). –

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