0

コードは次のとおりです。

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 ヘッダーの終了タグを ?> ではなく /> にしたため、出力を修正するために書きました)

4

3 に答える 3

0

それは実際には非常に論理的です。ReplaceChildは子ノードのクローンを作成せず、参照を挿入するだけです。そのため、ClearChildNodes()を呼び出すと、参照が追加されたすべてのドキュメントでクリアされます。HtmlNodeはCloneNode、CopyTo、Cloneを実装しているようです。これらのメソッドの1つを呼び出して、ノードのコピーを各ドキュメントに挿入する必要があります。

var newNodeStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
var newNode = HtmlNode.CreateNode(newNodeStr);

htmlDoc.DocumentNode.ReplaceChild(newNode.CloneNode(true), htmlDoc.DocumentNode.FirstChild);
segment.DocumentNode.ReplaceChild(newNode.CloneNode(true), segment.DocumentNode.FirstChild);
于 2012-06-19T14:24:42.970 に答える
0

HtmlAgilityPack には、「ウォッチ」を使用してデバッグしているときに要素を追加または削除または置換するときにバグがあります...この奇妙な動作を修正するには、デバッグ モードでウォッチ リストをクリアします...

于 2014-03-13T07:15:22.363 に答える
0

以下は私の問題を解決しますが、理由はわかりません。誰かが説明したいなら、私は素晴らしいと思います。

var newNodeStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
var newNode = HtmlNode.CreateNode(newNodeStr);
var newNode2 = HtmlNode.CreateNode(newNodeStr);
htmlDoc.DocumentNode.ReplaceChild(newNode, htmlDoc.DocumentNode.FirstChild);
segment.DocumentNode.ReplaceChild(newNode2, segment.DocumentNode.FirstChild);
于 2012-06-16T15:40:15.290 に答える