我真的希望有人可以帮助我解决这个问题。解决方案应该在 C# 上。
我有一个大小为 36 MB 和 900k 行的 xml 文件。在某些节点上,它有很多 html 标记和一些无效标记,例如
<Obs><p>
<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p>
我尝试了不同的方法来清理这个文件,但只有一种方法能够执行该任务,但是,由于这是在 Web 应用程序上执行的,它阻塞了应用程序并且需要大约 6 分钟才能完成任务并消耗大约 450MB记忆。
由于此文件是无效的 xml,我无法使用 XmlTextReader。使用 XLST,基于使用 XSLT 从 XML 中去除类似 HTML 的字符(不是标记)?,奇怪的是我也遇到了 HTML 实体的问题。
有效的过程(经过一些调整)如下http://www.codeproject.com/Articles/19652/HTML-Tag-Stripper
谢谢
编辑:
按照凯文的建议。我正在尝试使用 HTML Agility Pack 构建解决方案。至少要做一些基准测试。但是我被困住了。想象以下 xml 节点:
<Obs><p> I WANT THIS TEXT<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p></Obs>
如何剥离“obs”标签内的标签,保留标签“obs”并保留文本“I WANT THIS TEXT”?基本上是这样的:
<Obs>I WANT THIS TEXT</Obs>
现在这是我的代码:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(text);
Queue<HtmlNode> nodes = new Queue<HtmlNode>(doc.DocumentNode.SelectNodes("./*|./text()"));
while (nodes.Count > 0)
{
HtmlNode node = nodes.Dequeue();
HtmlNode parentNode = node.ParentNode;
HtmlNodeCollection childNodes = node.SelectNodes("./*|./text()");
if (childNodes != null)
{
foreach (HtmlNode child in childNodes)
{
if (child.Name != "obs")
{
nodes.Enqueue(child);
}
else
{
childNodes = child.SelectNodes("//p|//jantes");
foreach (HtmlNode nodeToStrip in childNodes)
nodeToStrip.ParentNode.RemoveChild(nodeToStrip);
}
}
}
}
string s = doc.DocumentNode.InnerHtml;
谢谢 :)
编辑 2
好的,我能够完成任务。然而,这需要太多时间。大约 3 小时,消耗 800MB 内存。
仍然需要帮助!
这是代码,它可能对某人有所帮助。
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(text);
Queue<HtmlNode> nodes = new Queue<HtmlNode>(doc.DocumentNode.SelectNodes("./*|./text()"));
while (nodes.Count > 0)
{
HtmlNode node = nodes.Dequeue();
HtmlNode parentNode = node.ParentNode;
HtmlNodeCollection childNodes = node.SelectNodes("./*|./text()");
if (childNodes != null)
{
foreach (HtmlNode child in childNodes)
{
if (child.Name != "obs")
{
nodes.Enqueue(child);
}
else
{
childNodes = child.SelectNodes("//p|//jantes");
if (childNodes != null)
{
foreach (HtmlNode nodeToStrip in childNodes)
{
var replacement = doc.CreateTextNode(nodeToStrip.InnerText);
nodeToStrip.ParentNode.ReplaceChild(replacement, nodeToStrip);
}
}
}
}
}
}
string s = doc.DocumentNode.InnerHtml;