我真的很希望有人能帮助我解决这个问题。解决方案应该在C#上。C#在HTML中标记HTML标记
我有一个大小为36 MB和900k行的xml文件。在某些节点上它有很多的HTML标记和一些无效的标记像
<Obs><p>
<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p>
我已经尝试了不同的方法来清洁该文件,但只有一个办法能够执行任务,但是,由于这是在一个Web应用程序上执行的,它阻止了应用程序,花了大约6分钟完成任务并耗费大约450MB的内存。
由于这个文件是无效的xml我不能使用XmlTextReader。 使用XLST,根据Strip HTML-like characters (not markup) from XML with XSLT?,奇怪我也与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”,并保持“我希望这个文本”的文本?基本上这样的:
<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;
谢谢:)
EDIT 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;
不喜欢Html Agility Pack的目的。虽然它非常强大。但它花了我4个小时来“清理”文件:( – blindado