0

我正在尝试从名为 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>
      (...)

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

4

1 回答 1

1

SelectNodes 的文档中明确表示:“该方法返回的 XmlNodeList 对象将有效,而底层文档保持不变。如果底层文档发生变化,可能会返回意外结果(不会抛出异常)。”

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

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

于 2010-03-23T11:35:08.143 回答