В вашем коде есть две ошибки. Одним из них является XPath, используемый для выбора узла (как указал Грег). Второе - это пространство имен. Возможно, я ошибаюсь, но при интерпретации XML-документа элемент TaskData
имеет следующее объявление пространства имен:
xmlns="http://schema.sample.com/application/1/520800B"
... который устанавливает пространство имен для элементов без префиксов.
Но тогда тег RequestInfo
имеет следующее объявление пространства имен:
xmlns="http://schema.sample.com/application/1/Types"
Таким образом, внутри тега RequestInfo
есть другое пространство имен для тегов без префиксов. В вашем коде вы используете первое из этих двух пространств имен для соответствия тегу, который находится во втором, что не сработает. Есть два способа решить это. Одним из них является просто изменить пространство имен в вашем коде:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("s", "http://schema.sample.com/application/1/Types");
XmlNode node = doc.SelectSingleNode("//s:Requestor", nsmgr);
Второй - определить оба пространства имен и использовать выражение XPath, указывающее полный путь к тегу:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("r", "http://schema.sample.com/application/1/520800B");
nsmgr.AddNamespace("s", "http://schema.sample.com/application/1/Types");
XmlNode node = doc.SelectSingleNode(@"/r:TaskData/r:Global/s:RequestInfo/s:Requestor", nsmgr);
Оба эти случая приводят к одному и тому же результату; node
не null
.