Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#带XML格式的HTML标记_C#_Html_Xml_Strip Tags_Xmltextreader - Fatal编程技术网

C#带XML格式的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> 我尝试了不同的方法来清理此文件,但只有一种方法能够执行此任务,

我真的希望有人能帮我解决这个问题。解决方案应该在C#上

我有一个36 MB大小的xml文件,有900k行。在某些节点上,它有很多html标记和一些无效标记,如

<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个小时来“清理”文件:(