Имеется Microsoft .NET Framework 1.1. Язык пусть будет C#.
Имеется Microsoft SQL Server Reporting Services 2003.
Если кто сталкивался, знает, а кто не сталкивался, тому говорю, что отчёты Reporting Services представляют собой XML-документы.
Корнем отчёта является тэг
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2003/10/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"/>
в коем указаны пути для схемы пространств имён.
Согласно схеме "по умолчанию" в отчёте имеется тип
<xsd:complexType name="CustomType">
<xsd:sequence>
<xsd:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
элементы какового присутствуют в ряде частей отчёта и, в том числе, в самом отчёте.
Т.е.
<Report><Custom>...</Custom>...</Report>
Стоит банальная задача выудить этот Custom и обработать.
Положим, имеется у нас уже корректно загруженный System.Xml.XmlDocument doc.
Какие предпринимались попытки получить ноду Custom:
Вариант 1. "В лоб"
XmlNode node = doc.SelectSingleNode("/Report/Custom");
результат всегда null.
Вариант 2. "Через корень хоть что-нибудь."
XmlNode node = doc.DocumentElement.SelectSingleNode("//Custom");
результат всегда null.
Вариант 3. "Учёт namespaces."
Как сказано в MSDN по этому поводу, имеется "Microsoft extension" для DOM. Посему, в случае явного задания пространства имён надо пользоваться соответствующим менеджером.
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
XmlNode node = doc.SelectSingleNode("//Custom", nsmgr);
результат всегда null.
Вариант 4. "Явное задание namespaces."
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
xmlNamespaceManager.AddNamespace("", "http://schemas.microsoft.com/sqlserver/reporting/2003/10/reportdefinition");
XmlNode node = doc.SelectSingleNode("//Custom", nsmgr);
результат всегда null.
Вариант 5. "Извращение"
XmlNode node = doc.SelectSingleNode("/*[local-name()='Report']/*[local-name()='Custom']");
Это работает.
Отчего это всё так. Как настроить нормальную обработку XPath?