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);

これはRDLReportingServicesXMLです。具体的な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 FrameworkのDOM実装の設計者は、まったく異なる動作をする具体的な実装の抽象クラスとしてXmlNodeListを使用することで間違いを犯しました。たとえばChildNodesを使用すると、W3C DOM仕様に必要なものに沿った「ライブ」ノードリストが得られるため、その場合、ドキュメントを変更するとノードリストが自動的に変更されます(必要な場合)。ただし、SelectNodesは、経験したように、まったく異なる動作のノードリストを返します。

于 2010-03-23T11:35:08.143 に答える