如何使用<div class="overflow"></div>
节点围绕所有表?这显然不会这样做:
if (oldElement.Name == "table")
{
HtmlDocument doc = new HtmlDocument();
HtmlNode newElement = doc.CreateElement("div");
newElement.SetAttributeValue("class", "overflow");
newElement.AppendChild(oldElement);
oldElement.ParentNode.ReplaceChild(newElement, oldElement);
}
当我尝试该代码时,表没有任何反应。但如果我使用:
if (oldElement.Name == "table")
{
oldElement.Remove();
}
确实删除了所有表,所以我确信我正在访问正确的节点。
答案 0 :(得分:7)
它可能有点难看,但你可以像这样编辑oldElement.ParentNode节点的InnerHtml属性:
if (oldElement.Name == "table")
{
oldElement.ParentNode.InnerHtml = "\r\n<div class=\"overflow\">\r\n"
+ oldElement.OuterHtml +
"\r\n</div>\r\n";
}
您似乎也无法编辑oldElement的OuterHtml属性(这就是您必须先获取ParentNode的原因)。 HtmlAgilityPack说你可以获取/设置OuterHtml,但VS2010告诉我它是一个只读属性。
修改强>
我正在玩一些代码来解决这个问题,并且在oldElement.ParentNode
被调用之后看到<div>
成为AppendChild()
节点。我找到的解决方案是在if块的开头创建另一个HtmlNode
来保存父节点,然后在该节点上调用ReplaceChild()
:
if (oldElement.Name == "table")
{
HtmlNode theParent = oldElement.ParentNode;
HtmlDocument doc = new HtmlDocument();
HtmlNode newElement = doc.CreateElement("div");
newElement.SetAttributeValue("class", "overflow");
newElement.AppendChild(oldElement);
theParent.ReplaceChild(newElement, oldElement);
}
答案 1 :(得分:2)
看看CsQuery,一个jQuery的C#端口。这很容易实现。首先加载文档:
CQ doc = CQ.CreateFromFile(..) // or
CQ doc = CQ.CreateFromUrl(..) // or
CQ doc = CQ.Create(string)
创建要包装的结构,这里有四种不同的方法。
var wrap = CQ.CreateFragment("<div class='overflow'></div>"); // or
// you can pass HTML as a selector as in jQuery. The property indexer for a CQ
// object is the default method, same as $(..)
var wrap = doc["<div class='overflow'></div>"]; // or
var wrap = doc["<div />"].AddClass("overflow"); // or
// creates an element directly, sames as browser DOM methods
var wrap = doc.Document.CreateElement("div");
wrap.ClassName="overflow";
使用结构包装所有表:
doc["table"].Wrap(wrap); // or use longhand for the Select method
doc.Select("table").Wrap(wrap);
将完整文档渲染为字符串:
string html = doc.Render();