这是代码:
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 标头结束标记 /> 而不是?>)