В данной статье хотелось бы рассказать о проблеме, решение которой я не сразу понял, потому что такое исключение нигде не встречалось в интернете.
Работая с
XPathNavigator,
XPathDocument (возможно и с
XDocument) и используя свой класс
XsltContext (подкласс XmlNamespaceManager) контекст,
что бы писать свои функции для
XPath, можно словить исключение:
System.NullReferenceException "Object reference not set to an instance of an object."
at MS.Internal.Xml.XPath.BaseAxisQuery.matches(XPathNavigator e)
at MS.Internal.Xml.XPath.CacheChildrenQuery.Advance()
at MS.Internal.Xml.XPath.AttributeQuery.Advance()
at MS.Internal.Xml.XPath.LogicalExpr.cmpQueryQueryE(Op op, Object val1, Object val2)
at MS.Internal.Xml.XPath.LogicalExpr.Evaluate(XPathNodeIterator nodeIterator)
at MS.Internal.Xml.XPath.FilterQuery.EvaluatePredicate()
at MS.Internal.Xml.XPath.FilterQuery.Advance()
at MS.Internal.Xml.XPath.CacheChildrenQuery.GetNextInput()
at MS.Internal.Xml.XPath.CacheChildrenQuery.Advance()
at MS.Internal.Xml.XPath.CacheChildrenQuery.GetNextInput()
at MS.Internal.Xml.XPath.CacheChildrenQuery.Advance()
at MS.Internal.Xml.XPath.XPathSelectionIterator.MoveNext()
Причина:
При использовании своей реализации XsltContext пропадает проверка на наличие добавленного namespace (через AddNamespace) у контекст менеджера. В результате, казалось бы обычный XPath запрос перестаёт ругаться на неизвестное пространство имен исключениями формата "XPathException. Additional information: Namespace prefix 'myns1' is not defined." и просто сваливается с NullReferenceException без какой либо причины.