私のXmlNodeコレクションまでいるXmlNodeListを台無しにするRemoveChild()を使用しようとすると
-
21-09-2019 - |
質問
私は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レポートサービスの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>
(...)
私は運の一切を、可能なすべての組み合わせを試してみました。何が私が間違っているのでしょうか? ありがとうございます。
解決
SELECTNODESのドキュメントははっきり言っを:「いるXmlNodeListオブジェクト基本となる文書は変化しないままで、このメソッドによって返されることは有効となります。基本的な文書が変更された場合、予期しない結果が(例外がスローされません)返されることがあります。 "
ですから、あなたのいるXmlNodeListを経験するあなたが文書を操作した後、あなたが期待するものではないかもしれませんSELECTNODESから返されたが、ドキュメントに沿ったものです。あなたは、ドキュメントを操作する場合は、新しいているXmlNodeListを取得するために再びSELECTNODESを呼び出す必要があります。
私の見解では、.NET FrameworkのDOM実装の設計者は、全く異なる動作と具体的な実装のための抽象クラスとしているXmlNodeListを使用してミスを犯しました。あなたは、例えば使用する場合ChildNodesは、あなたはW3C DOMの仕様では、(必要な場合)、文書の変更が自動的にノードリストを変更するような場合にはそれほど必要とするものに合わせて「ライブ」ノードリストを取得します。あなたが経験したようしかしSELECTNODESは、全く異なる振る舞いを持つノードのリストを返します。