Получение результатов из xpathnavigator evaluate

#c# #xpath #evaluate #navigator

#c# #xpath #оценить #навигатор

Вопрос:

Есть ли способ проверить, почему вызов XPathNavigator.evaluate() не возвращает узлов?

Например, учитывая следующий XML-документ:

 <Vehicles>
   <car>
      <wheels>4</wheels>
      <seats>5</seats>
   </car>
</Vehicles>
  

и следующее выражение XPath:

 //Vehicles[((car[wheels = 4 and seats = 2]))]
  

Я хотел бы получить какое-то указание на то, что узел не был выбран из-за предложения «seats = 2», а не из-за количества колес.

Возможно ли это каким-либо образом?

Ответ №1:

«Почему» — это не тот вопрос, который вы можете автоматизировать. Существует бесчисленное множество причин, по которым выражение XPath не будет выбирать какие-либо узлы. Что, если узлы находятся в неправильном пространстве имен? Что, если бы вы написали «//транспортные средства» вместо «//Vehicles»?

Лучшее, что вы можете сделать, это определить типы условий, которые вы хотите проверить, и протестировать их.

Ответ №2:

следующее выражение XPath:

 //Vehicles[((car[wheels = 4 and seats = 2]))] 
  

Я хотел бы получить какое-то указание на то, что узел не был выбран
из-за предложения «seats = 2», а не из-за количества колес.

Возможно ли это каким-либо образом?

Это было бы возможно, если бы вы использовали эти выражения:

 //Vehicles[car[wheels = 4]]
  

Здесь, если результат не равен null (или пустой коллекции XmlNode), то вы будете знать, что если следующее выражение:

 //Vehicles[car[wheels = 4][seats = 2]]
  

выбирает 0 узлов, тогда причина этого в том, что есть car дочерние элементы, у которых есть 4 колеса, но ни у одного из них нет ровно 2 мест.

Комментарии:

1. Я не могу сам писать запросы XPath, чтобы протестировать его подобным образом, потому что запрос XPath, который я хочу протестировать, генерируется во время выполнения. Если только не существует способа разделить предложения «where»

2. @user1041808: Вам следует отредактировать вопрос и объяснить это. В случае, если у вас нет контроля над генерацией выражений XPath во время выполнения, практически невозможно обработать выражение XPath и сделать из него два — если, конечно, вы не напишете свой собственный анализатор XPath.