XPath和SelectNodes方法

Mik*_*ike 0 c# xml xpath

首先我确实看到了这一点但它似乎没有帮助 .NET中的XPath SelectNodes

我正在尝试阅读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);
Run Code Online (Sandbox Code Playgroud)

现在我正在寻找应该在的Query节点

Report
...
    DataSets 
        DataSet
            Query
Run Code Online (Sandbox Code Playgroud)

现在,如果我看一些变量

  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"
Run Code Online (Sandbox Code Playgroud)

但问题是尝试了一些我无法访问此DataSet节点或任何子节点的事情.例

 xml.DocumentElement.SelectNodes(".//DataSets",ns);
 xml.DocumentElement.SelectNodes("DataSets",ns);
 xml.SelectSingleNode("//Report/DataSets",ns);
 xml.SelectSingleNode("//Query",ns);
Run Code Online (Sandbox Code Playgroud)

两者都返回null我做错了什么.

使用driis建议编辑

Mik*_*ike 6

谢谢你们带领我走正确的道路,这也有助于 使用xpath和rdlc报告

所以答案就是这样,你可以为任何你想要的前缀命名.取消注释掉线

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

并将其更改为

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

然后以下工作

 xml.SelectNodes("//def:DataSets",ns);
 xml.SelectSingleNode("//def:Report/def:DataSets", ns);
 xml.SelectSingleNode("//def:Query", ns);
Run Code Online (Sandbox Code Playgroud)