从Xml文档中删除jquery和CSS

时间:2012-05-01 15:48:09

标签: c# .net xml xml-parsing sgmlreader

我正在使用sgmlreader将HTML转换为XML。输出进入XmlDocument对象,然后我可以使用InnerText方法从网站中提取纯文本。我试图通过删除任何JavaScript来使文本看起来尽可能干净。循环遍历xml并删除任何<script type="text/javascript">都很容易,但是当任何jquery或样式没有封装在任何标签中时,我都会碰到一堵砖墙。有人可以帮帮我吗?

示例代码:

第一步: 一旦我使用webclient类下载HTML,我保存它,然后用文本阅读器类打开文件。

第二步: 创建sgmlreader类并将输入流设置为文本阅读器:

  // setup SGMLReader
            Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader();
            sgmlReader.DocType = "HTML";
            sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
            sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;
            sgmlReader.InputStream = reader;

            // create document
            doc = new XmlDocument();
            doc.PreserveWhitespace = true;
            doc.XmlResolver = null;
            doc.Load(sgmlReader);

第三步: 一旦我有了xmldocument,我就使用doc.InnerText来获取我的纯文本。

第四步: 我可以像这样轻松删除JavaScript代码:

 XmlNodeList nodes = document.GetElementsByTagName("text/javascript");

                for (int i = nodes.Count - 1; i >= 0; i--)
                {
                    nodes[i].ParentNode.RemoveChild(nodes[i]);
                }

有些东西仍然滑落。下面是我正在编写的一个特定网站的输出示例:

Criminal and Civil Enforcement | Fraud | Office of Inspector General | U.S. Department of Health and Human Services



#fancybox-right { 
right:-20px; 
} 
#fancybox-left { 
left:-20px; 
} 
#fancybox-right:hover span, #fancybox-right span 
#fancybox-right:hover span, #fancybox-right span { 
left:auto; 
right:0; 
} 
#fancybox-left:hover span, #fancybox-left span 
#fancybox-left:hover span, #fancybox-left span { 
right:auto; 
left:0; 
} 
#fancybox-overlay { 
/* background: url('/connections/images/wc-overlay.png'); */
/* background: url('/connections/images/banner.png') center center no-repeat; */
} 





$(document).ready(function(){

$("a[rel=photo-show]").fancybox({
'titlePosition' : 'over',
'overlayColor' : '#000',
'overlayOpacity' : 0.9
});

$(".title-under").fancybox({
'titlePosition' : 'outside',
'overlayColor' : '#000',
'overlayOpacity' : 0.9
}) 

}); 

需要删除jquery和样式。

1 个答案:

答案 0 :(得分:1)

我只是根据此页面的html将它放在LinqPad中,并正确删除了scriptstyle标记。

void Main()
{
    string htmlPath = @"C:\Users\Jschubert\Desktop\html\test.html";
    var sgmlReader = new Sgml.SgmlReader();
    var stringReader = new StringReader(File.ReadAllText(htmlPath));

    sgmlReader.DocType = "HTML";
    sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
    sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;
    sgmlReader.InputStream = stringReader;

    // create document
    var doc = new XmlDocument();
    doc.PreserveWhitespace = true;
    doc.XmlResolver = null;
    doc.Load(sgmlReader);

    List<XmlNode> nodes = doc.GetElementsByTagName("script")
                          .Cast<XmlNode>().ToList();
    var byType = doc.SelectNodes("script[@type = 'text/javascript']")
                          .Cast<XmlNode>().ToList();
    var style = doc.GetElementsByTagName("style").Cast<XmlNode>().ToList();
    nodes.AddRange(byType);
    nodes.AddRange(style);

    for (int i = nodes.Count - 1; i >= 0; i--)
    {
        nodes[i].ParentNode.RemoveChild(nodes[i]);
    }

    doc.DumpFormatted();

    stringReader.Close();
    sgmlReader.Close();
}

投射到XmlNode以使用通用列表并不理想,但我是为了空间和演示而做的。

另外,你不应该两个都 doc.GetElementsByTagName("script")
doc.SelectNodes("script[@type = 'text/javascript']")
我再次为了示范而这样做。

如果您有其他脚本并且只想删除JavaScript,请使用后者。如果要删除所有脚本标记,请使用第一个。或者,如果你愿意,可以同时使用它们。