Использование отчетов xpath и rdlc - PullRequest
4 голосов
/ 20 января 2010

Я постараюсь объяснить проблему очень ясно. Я использую MicroSoftReportViewer, куда я загружаю свой отчет. Но перед загрузкой я хочу кое-что изменить. Пока все в порядке. Я хочу использовать xpath, но когда я загружаю файл rdlc (xml) с помощью XMLDocument, выражение xpath не работает. Единственный xpath, который работает, это "\" ведьма получает root. Я открыл файл с помощью блокнота и увидел, что первый узел XML использует эти схемы

xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" 
xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"

Я попытался прочитать файл, используя XMLReader с добавленной XMLSchema, но xpath не работает. Пожалуйста, я буду очень признателен за получение кода, чтобы узнать, как загрузить файл, чтобы xpath работал.

С наилучшими пожеланиями, Йордан

1 Ответ

5 голосов
/ 18 февраля 2010

Боюсь, нам нужно увидеть ваше утверждение XPath, но я думаю, что проблема с пространствами имен.

Элементы без префикса находятся в default namespace, который дляПриведенный выше документ устанавливает для него значение
http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition.

Теперь запросы XPath должны включать эти пространства имен в запросы.Таким образом, selectSingleNode (/elementnameicanseeinnotepad) ничего вам не даст.

Чтобы добавить пространства имен в запросе, вам придется использовать класс XmlNamespaceManager (или использовать подробный синтаксис XPath, который я не использую)не рекомендую).

// get an instance  
XmlNamespaceManager xMngr = new XmlNamespaceManager();
// associate the prefix ´def´ with the namespace-uri from the xml document we loaded
xMngr.AddNamespace( `def´, http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition);
// associate the prefix ´rd´ (same as used in document) with the namespace-uri from the xml document we loaded
xMngr.AddNamespace( `rd´, http://schemas.microsoft.com/SQLServer/reporting/reportdesigner);

// use the prefix(s) in the XPath query  
xDoc.DocumentElement.SelectSingleNode(´/def:elementnameiseeinnotepad´, xMngr );

Надеюсь, это поможет.

...