XDocument.XPathSelectElements:我似乎无法正确获取xpath语法

时间:2012-08-30 23:30:48

标签: c# xpath

我正在试图找出为什么我的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恶魔高兴......: - (

1 个答案:

答案 0 :(得分:3)

<DefaultValue>元素实际上绑定到名称空间http://schemas.microsoft.com/sqlserver/reporting/2010/01/shareddatasetdefinition

<SharedDataSet>文档元素声明它没有前缀,因此很容易遗漏。由于<DefaultValue>是后代,因此它继承了命名空间。

如果要选择<DefaultValue>元素,则需要调整XPath:

//ns:DefaultValue