所以我试图编写代码将HTML转换为Mark Store for Windows Store应用程序。到目前为止,我在HtmlAgilityPack方面取得了很大的成功,但我遇到了一个问题。
这里有一些示例HTML
<p>A paragraph of text, including some text which is <strong>bolded</strong></p>
<p>Another paragraph</p>
我使用以下代码处理此问题。
foreach (var x in doc.Descendants.Where(x => x.Name == "p").ToList())
{
x.ParentNode.ReplaceChild(
HtmlAgilityPack.HtmlNode.CreateNode(x.InnerHtml
+ Environment.NewLine
+ Environment.NewLine),
x);
}
预期输出
A paragraph of text, including some text which is <strong>bolded</strong>
Another paragraph
但实际输出是
A paragraph of text, including some text which is
Another paragraph
似乎只要它碰到一个嵌套节点,它就会忽略那一点之后的所有内容。
如果我之前有一个规则来处理strong
标记,那么输出就是预期的。但是,我不能依靠做事#34;顺序&#34;因为那时无法在p
p
之类的事情
我做错了什么?
注意这适用于Windows应用商店应用,并使用WinRT版本的HTMLAgilityPack 不支持XPath
答案 0 :(得分:0)
CreateNode
方法将仅从解析的html返回第一个兄弟。这就是为什么你不会得到大胆的标签。所以你必须找到所有兄弟姐妹并将它们插回到para节点的位置并删除para节点。
此代码可以帮助您入门:
foreach (var x in doc.DocumentNode.Descendants().Where(x => x.Name == "p").ToList())
{
var node = HtmlNode.CreateNode(x.InnerHtml + Environment.NewLine + Environment.NewLine);
foreach (var child in node.ParentNode.ChildNodes)
{
x.ParentNode.InsertBefore(child, x);
}
x.ParentNode.RemoveChild(x);
}