【问题标题】:Trying to use RemoveChild() on XmlNodeList messes up my XmlNode collection尝试在 XmlNodeList 上使用 RemoveChild() 会弄乱我的 XmlNode 集合
【发布时间】:2010-03-22 23:59:16
【问题描述】:

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

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

【问题讨论】:

  • 对不起,具体是什么问题?您说哪个列表之后为零,您如何确定?
  • 在 removeChild() 方法之后,listaWidths 列表只有 1 个项目,当它应该有 4 个时,因为它原来有 5 个。我在变量上放了一个手表,只要方法 removeChild( ) 被执行,列表只有一项。

标签: c# xml xpath xmlnode xmlnodelist


【解决方案1】:

The documentation of SelectNodes明确表示:“该方法返回的XmlNodeList对象在底层文档不变的情况下是有效的。如果底层文档发生变化,可能会返回意外的结果(不会抛出异常)。”

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

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

【讨论】:

    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    相关资源
    最近更新 更多