为什么我无法按属性选择xml节点?

时间:2016-04-28 19:01:03

标签: c# xml xpath

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
  <Body>
  ...more stuff...  
  <Textbox Name="Textbox93">
      <CanGrow>true</CanGrow>
      <KeepTogether>true</KeepTogether>
      <Paragraphs>
        <Paragraph>
          <TextRuns>
            <TextRun>
              <Value rd:TranslationKey="DATE">Date</Value>
              <Style>
                <FontSize>11pt</FontSize>
                <FontWeight>Bold</FontWeight>
                <Color>#444444</Color>
              </Style>
            </TextRun>
          </TextRuns>
          <Style />
        </Paragraph>
      </Paragraphs>
      <rd:DefaultName>Textbox93</rd:DefaultName>
      <Style>
        <Border>
          <Color>LightGrey</Color>
          <Style>Solid</Style>
        </Border>
        <BackgroundColor>#82bad9</BackgroundColor>
        <PaddingLeft>2pt</PaddingLeft>
        <PaddingRight>2pt</PaddingRight>
        <PaddingTop>2pt</PaddingTop>
        <PaddingBottom>2pt</PaddingBottom>
      </Style>
    </Textbox>

这是较大的xml文档中的重复结构。我试图像这样拉出每个节点:<Value rd:LocId="DATE_VALUE">Date</Value>。我试图像这样检索节点:

var nsmgr = new XmlNamespaceManager(doc.NameTable);

nsmgr.AddNamespace("nm", "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition");
nsmgr.AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");

var nodes = doc.DocumentElement.SelectNodes("//Value[@rd:TranslationKey]", nsmgr);

我的节点数是0,我不知道为什么。这看起来像我在网上看到的例子。

1 个答案:

答案 0 :(得分:3)

哦不,不再是XML命名空间了!

当XML文档中有一个名称空间时,即使它是默认名称空间,所有节点名称(以及查询)都需要以该名称空间为前缀。

因此,如果您在Value前加上nm:,则代码应该可以正常运行,如下所示:

var nodes = doc.DocumentElement.SelectNodes("//nm:Value[@rd:TranslationKey]", nsmgr);