XPath和SelectNodes方法

时间:2011-02-10 19:42:03

标签: c# xml xpath

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

我正在尝试阅读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);

现在我正在寻找应该在

下的Query节点
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"

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

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

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

使用driis建议编辑

3 个答案:

答案 0 :(得分: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)

这将返回xml XmlDocument中的所有DataSet节点:

xml.SelectNodes("//DataSets");

请注意,这会返回XmlNodeList作为您可以迭代的类型。

如果您确定问题与命名空间有关,请查看http://support.microsoft.com/kb/318545

答案 2 :(得分: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
}