【问题标题】:XPath and SelectNodes MethodXPath 和 SelectNodes 方法
【发布时间】:2011-02-11 07:03:14
【问题描述】:

首先我确实看到了这个,但它似乎没有帮助 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);

现在我正在寻找应该在下面的查询节点

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 建议编辑

【问题讨论】:

标签: c# xml xpath


【解决方案1】:

感谢你们带领我走上正确的道路, 这也有帮助 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);

【讨论】:

  • 是的,您可以随心所欲地命名前缀,但永远不要像“xmlns:rd”:: 冒号字符不是前缀的有效部分。跨度>
【解决方案2】:

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

xml.SelectNodes("//DataSets");

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

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

【讨论】:

    【解决方案3】:

    那你为什么不干呢

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多