首先,我确实看到了这一点,但似乎没有帮助 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建议编辑
答案 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
}