我正在试图找出为什么我的xpath不会选择我特定的节点
我的xpath表达式是//DefaultValue
,因此我希望选择名称DefaultValue的所有元素
我的测试文件(缩减)是:
<?xml version="1.0" encoding="utf-8"?>
<SharedDataSet xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/shareddatasetdefinition">
<Description />
<DataSet Name="ddd">
<Query>
<DataSourceReference>xxx</DataSourceReference>
<DataSetParameters>
<DataSetParameter Name="p1">
<DefaultValue>baaaah</DefaultValue> <!-- this node should be selected eh? -->
</DataSetParameter>
<DataSetParameter Name="p2">
<DefaultValue>fooo</DefaultValue> <!-- this node should be selected too eh? -->
</DataSetParameter>
</DataSetParameters>
</Query>
</SharedDataSet>
代码是:
XmlNamespaceManager xn = new XmlNamespaceManager(new NameTable());
xn.AddNamespace("ns", "http://schemas.microsoft.com/sqlserver/reporting/2010/01/shareddatasetdefinition");
xn.AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
xn.AddNamespace("cl", "http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition");
XDocument document = XDocument.Parse(reportBuffer, LoadOptions.PreserveWhitespace);
IEnumerable<XElement> elements = document.XPathSelectElements(xpath, xn);
此时elements.Count() equals 0
有谁能看到我提出的愚蠢行为?
我似乎无法让xml恶魔高兴......: - (
答案 0 :(得分:3)
<DefaultValue>
元素实际上绑定到名称空间http://schemas.microsoft.com/sqlserver/reporting/2010/01/shareddatasetdefinition
。
<SharedDataSet>
文档元素声明它没有前缀,因此很容易遗漏。由于<DefaultValue>
是后代,因此它继承了命名空间。
如果要选择<DefaultValue>
元素,则需要调整XPath:
//ns:DefaultValue