Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: XML, XPath-запрос, .NET и пространства имён  (Прочитано 4323 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 14-02-2006 16:17 » 

Имеется 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?
« Последнее редактирование: 13-12-2007 20:24 от Алексей1153++ » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 14-02-2006 16:37 » 

Всё, разрешилось.

По варианту 4. Надо писать:
Код:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("x", "http://schemas.microsoft.com/sqlserver/reporting/2003/10/reportdefinition");
XmlNode node = doc.SelectSingleNode("/x:Report/x:Custom", nsmgr);

Где "х" - произвольное имя для безымянного пространства имён по умолчанию.
« Последнее редактирование: 16-02-2006 07:55 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines