我真的希望有人可以帮我解决这个问题。解决方案应该在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,基于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;
谢谢:)
编辑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;
答案 0 :(得分:4)
你试过Html Agility Pack吗?在其声明中:
- 解析器非常容忍“真实世界”格式错误的HTML
- 你可以按照你想要的方式修改页面,修改DOM,添加节点,复制节点,以及......你的名字