выберите узлы xml, используя путаницу синтаксиса xpath - PullRequest
1 голос
/ 09 ноября 2011

Учитывая приведенный ниже xml, почему первый вызов selectsinglenode не работает, а второй работает?Одиночные кавычки указывают тип строки или что-то?

Dim dbglvlnode As Xml.XmlNode = doc.SelectSingleNode(String.Format("Config/Scanner[DeviceID = '{0}']/DebugLevel", XMLstuff.DeviceID))
Dim dbglvlnode As Xml.XmlNode = doc.SelectSingleNode(String.Format("Config/Scanner[DeviceID = {0}]/DebugLevel", XMLstuff.DeviceID))
<?xml version="1.0" standalone="yes"?>
<Config>
 <Scanner>
  <!--Test Scanner-->
  <DeviceID>00199</DeviceID>
  <DeviceNumber>0099</DeviceNumber>
  <DebugLevel>10</DebugLevel>
 </Scanner>
</Config>

1 Ответ

1 голос
/ 09 ноября 2011

Ваш первый подход приведет к выражению XPath вроде этого:

Config/Scanner[DeviceID = '00199']/DebugLevel

Это вернет элемент DebugLevel первого Scanner в Config, для которого элемент DeviceID имеет текстовое значение 00199

Ваш второй подход приведет к выражению XPath, как это:

Config/Scanner[DeviceID = 00199]/DebugLevel

Это вернет элемент DebugLevel первого сканера в конфигурации, для которого элемент DeviceID имеет числовой значение 00199.

Разница в том, что первый подход будет точно соответствовать 00199, поэтому, если XMLstuff.DeviceID является целым числом или строкой со значением 199, он не будет работать,Второй подход будет работать до тех пор, пока содержимое элемента оценивается как целое число с правильным значением.Так что да, одинарные кавычки идентифицируют эту правую часть сравнения как текст.

XPath довольно мягок в преобразовании типов данных и выполнении сравнений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...