2011-02-10 4 views
0

Сначала я видел это, но это не похоже, чтобы помочь XPath SelectNodes in .NETXPath и SelectNodes Метод

Я пытаюсь прочитать Defination отчет SSRS.

ReportingService report = new ReportingService(); 
report.Credentials = System.Net.CredentialCache.DefaultCredentials; 

string x = new System.Text.UTF8Encoding().GetString( 
          report.GetReportDefinition(ReportName)); 

//Remove a Character at the beginning of the document -- Char 65279 
x = x.Replace(x.Substring(0, 1), ""); 
XmlDocument xml = new XmlDocument(); 

XmlNamespaceManager ns = new XmlNamespaceManager(xml.NameTable); 
// This appears to be a reserved default? 
//ns.AddNamespace("xmlns","http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"); 
ns.AddNamespace("xmlns:rd","http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"); 
xml.LoadXml(x); 

Теперь я ищу для узла запроса, который должен быть под

Report 
... 
    DataSets 
     DataSet 
      Query 

Теперь, если я смотрю на некоторые переменные

xml.Name = "#document" 
    xml.DocumentElement.Name = "Report" 
    xml.DocumentElement.ChildNodes[12].Name = "DataSets" 
    xml.DocumentElement.ChildNodes[12].ChildNodes[0].Name = "DataSet" 
    xml.DocumentElement.ChildNodes[12].ChildNodes[0].ChildNodes[1].Name = "Query" 

Но проблема пытается несколько вещей, которые я не может попасть в этот узел DataSets или в любые подносы. Пример

xml.DocumentElement.SelectNodes(".//DataSets",ns); 
xml.DocumentElement.SelectNodes("DataSets",ns); 
xml.SelectSingleNode("//Report/DataSets",ns); 
xml.SelectSingleNode("//Query",ns); 

Оба возвращают null, что я делаю неправильно.

отредактированных с помощью driis КОНСУЛЬТАЦИЯ

+1

Является ли документ XML с использованием пространств имен? В этом случае вам нужно включить пространство имен для вашего XPath, возможно, используя XmlNamespaceManager. http://www.google.dk/search?sourceid=chrome&ie=UTF-8&q=XMnnamespacemanager – driis

+0

Да два, xmlns = "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns: rd = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" Мне нужно выяснить, как включить это, спасибо за ссылку – Mike

ответ

6

Спасибо вам ребята за меня ведет вниз правильный путь , это также помогло Using xpath and rdlc report

Итак, ответ на этот вопрос, вы можете назвать свои префиксы чем угодно. раскомментировав из линии

ns.AddNamespace("xmlns","http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"); 

и изменить его на

ns.AddNamespace("def","http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"); 

Тогда следующие работы

xml.SelectNodes("//def:DataSets",ns); 
xml.SelectSingleNode("//def:Report/def:DataSets", ns); 
xml.SelectSingleNode("//def:Query", ns); 
+1

+1 для самообучения. – Flack

+1

Да, вы можете называть свои префиксы в любом случае, **, но никогда **, как «' xmlns: rd' »:': 'colons character недопустима в префиксе. –

1

это возвращает вам все DataSets узлы в xml XmlDocument:

xml.SelectNodes("//DataSets"); 

Обратите внимание, что это возвращает XmlNodeList как тип, на котором вы можете итерацию.

Если вы уверены, что проблема связана с пространствами имен, взгляните на http://support.microsoft.com/kb/318545

0

Тогда почему вы не просто делать

XmlNodeList queries = xml.SelectNodes("//Query"); 
//selects 'Query' node occuring anywhere 

foreach(XmlNode query in queries){ 
    XmlNode dataSetForquery = query.GetParent(); 

    //do some other stuff with query here 
} 
Смежные вопросы