C#带XML格式的HTML标记
我真的希望有人能帮我解决这个问题。解决方案应该在C#上 我有一个36 MB大小的xml文件,有900k行。在某些节点上,它有很多html标记和一些无效标记,如C#带XML格式的HTML标记,c#,html,xml,strip-tags,xmltextreader,C#,Html,Xml,Strip Tags,Xmltextreader,我真的希望有人能帮我解决这个问题。解决方案应该在C#上 我有一个36 MB大小的xml文件,有900k行。在某些节点上,它有很多html标记和一些无效标记,如 <Obs><p> <jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p> 我尝试了不同的方法来清理此文件,但只有一种方法能够执行此任务,
<Obs><p>
<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p>
我尝试了不同的方法来清理此文件,但只有一种方法能够执行此任务,然而,由于这是在web应用程序上执行的,它会阻塞该应用程序,需要大约6分钟来完成此任务,并消耗大约450MB内存
由于此文件是无效的xml,我无法使用XmlTextReader。
奇怪的是,使用基于的XLST,我也遇到了HTML实体的问题
工作过程(经过一些调整)如下所示
谢谢
编辑:
听从凯文的建议。我正在尝试使用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;
HtmlDocument doc=新的HtmlDocument();
doc.LoadHtml(文本);
队列节点=新队列(doc.DocumentNode.SelectNodes(“./*|/text()”);
而(nodes.Count>0)
{
HtmlNode node=nodes.Dequeue();
HtmlNode parentNode=node.parentNode;
HtmlNodeCollection childNodes=node.SelectNodes(“./*|/text()”);
if(childNodes!=null)
{
foreach(childNodes中的HtmlNode子节点)
{
if(child.Name!=“obs”)
{
节点排队(子节点);
}
其他的
{
childNodes=child.SelectNodes(“//p |//jantes”);
foreach(子节点中的HtmlNodeToStrip)
nodeToStrip.ParentNode.RemoveChild(nodeToStrip);
}
}
}
}
字符串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;
HtmlDocument doc=新的HtmlDocument();
doc.LoadHtml(文本);
队列节点=新队列(doc.DocumentNode.SelectNodes(“./*|/text()”);
而(nodes.Count>0)
{
HtmlNode node=nodes.Dequeue();
HtmlNode parentNode=node.parentNode;
HtmlNodeCollection childNodes=node.SelectNodes(“./*|/text()”);
if(childNodes!=null)
{
foreach(childNodes中的HtmlNode子节点)
{
if(child.Name!=“obs”)
{
节点排队(子节点);
}
其他的
{
childNodes=child.SelectNodes(“//p |//jantes”);
if(childNodes!=null)
{
foreach(子节点中的HtmlNodeToStrip)
{
var replacement=doc.CreateTextNode(nodeToStrip.InnerText);
nodeToStrip.ParentNode.ReplaceChild(替换,nodeToStrip);
}
}
}
}
}
}
字符串s=doc.DocumentNode.InnerHtml;
你试过了吗?在其索赔中:
- 解析器对“真实世界”格式错误的HTML非常宽容
- 您可以按照自己的方式修复页面、修改DOM、添加节点、复制节点,以及。。。随便你说
- 解析器对“真实世界”格式错误的HTML非常宽容
- 您可以按照自己的方式修复页面、修改DOM、添加节点、复制节点,以及。。。随便你说
因此,我不喜欢Html敏捷包。不过它很强大。但我花了4个小时来“清理”文件:(我不喜欢Html Agility Pack,但它非常强大。但我花了4个小时来“清理”文件:(