试图在XmlNodeList上使用RemoveChild()会弄乱我的XmlNode集合

时间:2010-03-22 23:59:16

标签: c# xml xpath xmlnode xmlnodelist

我正在尝试从名为listaWidths的XmlNodeList中删除特定节点。在使用RemoveChild()之前,此特定列表有5个项目。但是,在RemoveChild()语句之后,列表只保留1个项目。

XmlNodeList listaWidths = xmlDoc.SelectNodes("/MsBuild:Report/MsBuild:Body/MsBuild:ReportItems/MsBuild:Tablix/MsBuild:TablixBody/MsBuild:TablixColumns/*", nsmgr);                
int indexEpoca = 0;
XmlNode node = listaWidths[indexEpoca];
XmlNode parent = listaWidths[indexEpoca].ParentNode;
parent.RemoveChild(node);

这是RDL Reporting Services XML。 具体的XML代码在这里:

  <Tablix Name="Tablix3">
    <TablixBody>
      <TablixColumns>
        <TablixColumn>
          <Width>1.602in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.61in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.6323in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.6023in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.6033in</Width>
        </TablixColumn>
      </TablixColumns>
      (...)

我尝试了所有可能的组合,没有任何运气。我究竟做错了什么? 谢谢。

1 个答案:

答案 0 :(得分:1)

The documentation of SelectNodes清楚地说:“此方法返回的XmlNodeList对象在底层文档保持不变时有效。如果底层文档发生更改,可能会返回意外结果(不会抛出异常)。” / p>

因此,在操作文档后,您从SelectNodes返回的XmlNodeList所遇到的可能不是您所期望的,但与文档一致。如果操作文档,则必须再次调用SelectNodes以获取新的XmlNodeList。

在我看来,.NET框架中DOM实现的设计者通过使用XmlNodeList作为具体行为的具体实现的抽象类而犯了一个错误。如果您使用例如然后,您可以获得符合W3C DOM规范要求的“实时”节点列表,因此在这种情况下,文档更改会自动更改节点列表(如果需要)。但是,正如您所经历的那样,SelectNodes返回具有完全不同行为的节点列表。