HtmlAgilityPack-removeelements,butnotinnerHtmlnote.Remove():HtmlDocumenthtml=newHtmlDocument();html.Load(Server.MapPath(@"~Sitethemesdefaultindex.cshtml"));foreach(variteminhtml.DocumentNode.SelectNodes("//removeMe")){item.Remove();但这也删除了innerHtml。如果我只想删除标签并保留innerHtml怎么办?示例:任何帮助将不胜感激:)HtmlAgilityPack.HtmlDocumentdoc=newHtmlAgilityPack.HtmlDocument();doc.LoadHtml(html);varnode=doc.DocumentNode.SelectSingleNode("//removeme");node.ParentNode.RemoveChild(node,true);这应该有效:foreach(varitemindoc.DocumentNode.SelectNodes("//removeMe")){if(item.PreviousSibling==null){//Firstelement->所以将它添加到父级的innerhtml项目的开头。ParentNode.InnerHtml=item.InnerHtml+item.ParentNode.InnerHtml;}else{//itemToRemove之前有一个元素->在上一个item之后添加innerhtmlforeach(HtmlNodenodeinitem.ChildNodes){item.PreviousSibling.ParentNode.InsertAfter(node,item.PreviousSibling);}}item.Remove();}boolKeepGrandChildren实现的问题可能是那些可能包含他们试图删除的元素的文本。如果文本包含在removeme标签中,该文本也将被删除。例如textmore文本将变成更多文本试试这个:privatestaticvoidRemoveElementKeepText(HtmlNodenode){//node.ParentNode.RemoveChild(node,true);HtmlNodeparent=node.ParentNode;HtmlNodeprev=node.PreviousSibling;HtmlNodenext=node.NextSibling;foreach(HtmlNodechildinnode.ChildNodes){if(prev!=null)parent.InsertAfter(child,prev);elseif(next!=null)parent.InsertBefore(child,next);否则父母。追加孩子(孩子);}node.Remove();有一个简单的方法:element.InnerHtml=element.InnerHtml.Replace("","{1}");varinnerTextWithBR=element.InnerText.Replace("{1}","");也许这就是你想要的?foreach(HtmlNodenodeinhtml.DocumentNode.SelectNodes("//removeme")){HtmlNodeCollectionchildren=node.ChildNodes;//获取子节点HtmlNodeparent=node.ParentNode;//get的父节点.Remove();//移除parent.AppendChildren(children);//appendthechildrentoparent}编辑:LB的回答更清楚。跟他走!这个怎么样?varremovedNodes=document.SelectNodes("//removeme");if(removedNodes!=null)foreach(varrninremovedNodes){HtmlTextNodeinnernodes=document.CreateTextNode(rn.InnerHtml);rn.ParnetNode.ReplaceChild(innernodes,rn);添加我的两分钱,因为这些方法都不能处理我想要的(删除一组给定的标签,如p和div,并在保留内部标签的同时正确处理嵌套)。这是我想出的,并且在我考虑过的大多数情况下都通过了所有单元测试:varhtmlDoc=newHtmlDocument();//加载htmlhtmlDoc.LoadHtml(html);vartags=(fromtaginhtmlDoc.DocumentNode.Descendants()wheretagNames.Contains(tag.Name)selecttag).Reverse();//查找格式化标签foreach(varitemintags){if(item.PreviousSibling==null){//以相反的顺序将子节点添加到父节点foreach(HtmlNodenodeinitem.ChildNodes.Reverse()){item.ParentNode.PrependChild(节点);}}else{//在前一个兄弟之后插入孩子foreach(HtmlNodenodeinitem.ChildNodes){item.ParentNode.InsertAfter(node,item.PreviousSibling);}}//从树中移除item.Remove();}//返回转换后的文档html=htmlDoc.DocumentNode.WriteContentTo().Trim();测试示例:[TestMethod]publicvoidStripTags_CanStripSingleTag(){varinput="tag";varexpected="标签";varactual=HtmlUtilities.StripTags(输入,"p");Assert.AreEqual(预期,实际);}[测试方法]publicvoidStripTags_CanStripNestedTag(){varinput="taginner";varexpected="标签内部";varactual=HtmlUtilities.StripTags(输入,"p");Assert.AreEqual(预期,实际);}[TestMethod]publicvoidStripTags_CanStripTwoTopLevelTags(){varinput="tagblock";varexpected="标签块";varactual=HtmlUtilities.StripTags(输入,"p","div");Assert.AreEqual(预期,实际);}[TestMethod]publicvoidStripTags_CanStripMultipleNestedTags_2LevelsDeep(){varinput="taginner";varexpected="标签内部";varactual=HtmlUtilities.StripTags(输入,"p","div");Assert.AreEqual(预期,实际);}[TestMethod]publicvoidStripTags_CanStripMultipleNestedTags_3LevelsDeep(){varinput="taginnersuperinner";varexpected="taginnersuperinner";varactual=HtmlUtilities.StripTags(输入,"p","div");Assert.AreEqual(预期,实际);}[测试方法]publicvoidStripTags_CanStripTwoTopLevelMultipleNestedTags_3LevelsDeep(){varinput="标记内部superinner内部顶层”;varexpected=“taginnersuperinnerinnertoplevel”;varactual=HtmlUtilities.StripTags(input,“p”,“div”);Assert.AreEqual(expected,actual);}[TestMethod]publicvoidStripTags_IgnoresTagsThatArentSpecified(){varinput="taginnersuperinner";varexpected="taginnersuperinner";varactual=HtmlUtilities.StripTags(input,"p","div");Assert.AreEqual(expected,actual);input="taginner";expected="taginner";actual=HtmlUtilities.StripTags(input,"p","div");Assert.AreEqual(expected,actual);}[TestMethod]publicvoidStripTags_CanStripSelfClosingAndUnclosedTagsLikeBr(){varinput="tag";varexpected="tag";varactual=HtmlUtilities.StripTags(input,"p","br");Assert.AreEqual(expected,actual);}它可能无法处理所有事情,但它满足我的需要通常,正确的表达式是node.ParentNode.RemoveChildren(node,true)。由于HtmlNode.RemoveChildren()(http://htmlagilitypack.codeplex.com/discussions/79587)中的排序错误,我创建了类似的方法。对不起,这是VB。如果有人想要翻译,我会写一个。'HTML敏捷包(1.4.9)包括HtmlNode.RemoveChild()方法,但它有一个保留子节点的排序错误。'下面的实现命令孩子正确。PrivateSharedSubRemoveNode(nodeAsHtmlAgilityPack.HtmlNode,keepChildrenAsBoolean)Dimparent=node.ParentNodeIfkeepChildrenThenFori=node.ChildNodes.Count-1到0步-1parent.InsertAfter(node.ChildNodes(i),node)NextEndIfnode.Remove()EndSubi此代码已使用以下测试标记进行测试:用htmlagilitypack做什么?以上是C#学习教程:HtmlAgilityPack——删除元素,但不删除innerHtml共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——stringhtml="";html=Regex.Replace(html,"","",RegexOptions.Compiled);html=Regex.Replace(html,"","",RegexOptions.Compiled);本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
