首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Xml文档中删除jquery和CSS

从Xml文档中删除jquery和CSS
EN

Stack Overflow用户
提问于 2012-05-01 23:48:09
回答 1查看 512关注 0票数 1

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

示例代码:

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

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

代码语言:javascript
复制
  // 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);

第三步:一旦我有了一个get文档,我就使用doc.InnerText来获得我的纯文本。

第四步:我可以像这样轻松地删除JavaScript标签:

代码语言:javascript
复制
 XmlNodeList nodes = document.GetElementsByTagName("text/javascript");

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

有些东西还是会漏掉。下面是我正在编写的一个特定网站的输出示例:

代码语言:javascript
复制
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和样式需要删除。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-02 04:48:51

我只是根据这个页面的html在LinqPad中编写了这些代码,它正确地删除了scriptstyle标签。

代码语言:javascript
复制
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,请使用后者。如果要删除所有脚本标记,请使用第一个脚本标记。或者,如果您愿意,可以同时使用这两种方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10400262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档