2

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

4

1 回答 1

3

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

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

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

//ns:DefaultValue
于 2012-08-31T02:10:26.110 回答