コードは次のとおりです。
HtmlDocument htmlDoc = new HtmlDocument();
HtmlDocument segment = new HtmlDocument();
htmlDoc.OptionWriteEmptyNodes = true;
segment.OptionWriteEmptyNodes = true;
htmlDoc.Load("sourcepath");
segment.Load("sourcepath");
//Fix HtmlAgilityPack bug with ending tag at xmldeclaration
var newNodeStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
var newNode = HtmlNode.CreateNode(newNodeStr);
htmlDoc.DocumentNode.ReplaceChild(newNode, htmlDoc.DocumentNode.FirstChild);
segment.DocumentNode.ReplaceChild(newNode, segment.DocumentNode.FirstChild);
HtmlNode sbodyNode = segment.DocumentNode.SelectSingleNode("//body");
if (sbodyNode != null)
sbodyNode.RemoveAllChildren();
HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");
int numberOfChilds = bodyNode.ChildNodes.Count;
MessageBox.Show(numberOfChilds.ToString());
segment.Save("destpath1", Encoding.UTF8);
htmlDoc.Save("destpath2", Encoding.UTF8);
入力は単純な xhtml です。xhtml ファイルを変更したい (これは htmlDoc で表されます)。このために、別の HtmlDocument オブジェクトを作成しました (セグメント、同じ xhtml をそれにロードします)。最初のステップとして、body 要素のすべての子を削除しようとしています。次に、htmlDoc オブジェクトを使用して要素の一部を追加します。上記の問題は、これらをセグメントから削除すると htmlDoc (他のオブジェクト) にも影響することです。したがって、MessageBox には常に 0 が表示されます。これに加えて、保存関数によって生成される出力を見ると、htmlDoc の下に要素があり、これは MessageBox がそれらの数を表示する必要があることを意味します(私が推測する限り)。(注: RemoveAllChildren() 行のコメントを外すと、MessageBox に正しい番号が表示されます。) 些細なことだと思いますが、私にとってはちょっと奇妙です。ご協力いただきありがとうございます。
更新:申し訳ありませんが、一部の行は無関係だと思っていたため、完全なコードを投稿しませんでしたが、そうではないようです。Loads の後にこれらの 4 行をコメントアウトすると、正しい数値が得られ、期待どおりに動作します。問題は、これらの行が「害」を及ぼす理由です。(これらの行は、agilitypack が xml ヘッダーの終了タグを ?> ではなく /> にしたため、出力を修正するために書きました)