Могу ли я использовать XPathExpression, скомпилированное из одного навигатора, с другим навигатором?

#.net #xml #xpath #xpathnavigator

#.net #xml #xpath #xpathnavigator

Вопрос:

Если я получу XPathNavigator и использую его для компиляции XPathExpression exp, какие существуют ограничения на то, как я могу использовать exp? Могу ли я использовать exp с другим навигатором? Я знаю, что он запускается и, кажется, выдает правильные результаты, даже если компилирующий XPathNavigator был сформирован из документа или узла, который сильно отличается от оценивающего XPathNavigator. Но я не знаю, безопасно ли это.

Вот элементарный пример того, что я имею в виду. Это бессмысленно, но иллюстрирует суть

 private object TestXPath(XmlNode n1, XmlNode n2)
{
  XPathNavigator nav1 = n1.CreateNavigator();
  XPathExpression exp = nav1.Compile("somexpath");

  // evaluate using the navigator that compiled exp
  object result = n1.Evaluate(exp);
  if (result == null)
  {
    XPathNavigator nav2 = n2.CreateNavigator();
    // evaluate using a navigator that did NOT compile exp.  Is this legal?
    result = nav2.Evaluate(exp);
  }
  return resu<
}
  

Ответ №1:

Вы можете свободно использовать это выражение в других навигаторах. По словам Даниэля Каццулино, документ, из которого вы создаете исходный навигатор, не имеет значения, поскольку компиляция выражения xpath не зависит от экземпляра документа.
http://weblogs.asp.net/cazzu/archive/2003/10/07/30888.aspx