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。最重要的是,如果我查看由 Save 函数生成的输出,htmlDoc 将在 下有元素,这意味着 MessageBox 应该显示它们的数量(据我猜测)。(注意:如果我取消注释 RemoveAllChildren() 行,然后 MessageBox 显示正确的数字。)我认为它是一些微不足道的东西,但对我来说有点奇怪。谢谢你的帮助。

更新:对不起,我没有发布完整的代码,因为我认为有些行无关紧要,但看起来不是。如果我在 Loads 之后注释掉这 4 行,我会得到正确的数字,并且它会像预期的那样工作。问题是为什么这些线会“有害”。(我写这些行是为了修复输出,因为 agilitypack 使 xml 标头结束标记 /> 而不是?>)

4

3 回答 3

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 回答
0

HtmlAgilityPack 在您使用“监视”并且正在调试时添加或删除或替换元素时出现错误...要修复此奇怪行为,请在调试模式下清除您的监视列表...

于 2014-03-13T07:15:22.363 回答
0

这实际上是非常合乎逻辑的。ReplaceChild 不会克隆子节点,它只是插入引用。因此,如果您在其上调用 ClearChildNodes(),它将在添加引用的所有文档中被清除。看起来 HtmlNode 实现了 CloneNode、CopyTo 和 Clone。应调用其中一种方法将节点的副本插入到每个文档中。

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 回答