Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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# 如何解析HTML以修改所有单词_C#_Html - Fatal编程技术网

C# 如何解析HTML以修改所有单词

C# 如何解析HTML以修改所有单词,c#,html,C#,Html,这似乎是一个反复出现的问题,但问题来了 我有格式良好的HTML(它来自受控源代码,因此可以将其视为给定的)。我需要遍历HTML主体的内容,查找文档中的所有单词,对这些单词执行一些编辑,并保存结果 例如,我有一个文件sample.html,我想通过我的应用程序和product output.html运行它,它与原始文件完全相同,再加上我的编辑 我使用HTMLAgilityPack找到了以下内容,但我找到的所有示例都是针对指定标记的属性的——是否有一个简单的修改可以查看内容并执行编辑 HtmlDoc

这似乎是一个反复出现的问题,但问题来了

我有格式良好的HTML(它来自受控源代码,因此可以将其视为给定的)。我需要遍历HTML主体的内容,查找文档中的所有单词,对这些单词执行一些编辑,并保存结果

例如,我有一个文件sample.html,我想通过我的应用程序和product output.html运行它,它与原始文件完全相同,再加上我的编辑

我使用HTMLAgilityPack找到了以下内容,但我找到的所有示例都是针对指定标记的属性的——是否有一个简单的修改可以查看内容并执行编辑

HtmlDocument HD = new HtmlDocument();
HD.Load (@"e:\test.htm");
var NoAltElements = HD.DocumentNode.SelectNodes("//img[not(@alt)]");
if (NoAltElements != null)
{
    foreach (HtmlNode HN in NoAltElements)
    {
       HN.Attributes.Append("alt", "no alt image");
    }
}

HD.Save(@"e:\test.htm");
上面查找没有ALT标记的图像标记。我想在文件的
中查找所有标记,并对内容做一些处理(这可能涉及在此过程中创建新标记)

我可能会做的一个非常简单的示例是获取以下输入:

<html>
    <head><title>Some Title</title></head>
    <body>
        <h1>This is my page</h1>
        <p>This is a paragraph of text.</p>
    </body>
</html>

一些头衔
这是我的页面
这是一段文字

并生成输出,它接受每个单词,并在大写和斜体之间交替:

<html>
    <head><title>Some Title</title></head>
    <body>
        <h1>THIS <em>is</em> MY <em>page</em></h1>
        <p>THIS <em>is</em> A <em>paragraph</em> OF <em>text</em>.</p>
    </body>
</html>

一些头衔
这是我的页面
这是一段文字


想法、建议?

试试
。选择节点(“///body//*”)
。这将使您获得任何
主体
元素中任何深度的所有元素。

就我个人而言,在这种设置下,我将使用HtmlNode的InnerText属性查找单词(可能使用Regex,这样我就可以排除标点符号,而不只是依赖空格)然后使用InnerHtml属性使用对Regex.Replace的迭代调用进行更改(因为Regex.Replace有一个方法,允许您指定开始位置和替换次数)

处理代码:

IEnumerable<HtmlNode> nodes = doc.DocumentNode.DescendantNodes().Where(n => n.InnerText == "something");
foreach (HtmlNode node in nodes)
{
    string[] words = getWords(node.InnerText);

    node.InnerHtml = processHtml(node.InnerHtml, words);
}

我将把alterWord()的详细信息留给您。:)

但是,我如何迭代该标记的内容,才能解析出不是标记的每个单词呢?在这一点上,您几乎必须依赖于将元素的内容作为字符串处理,可能使用正则表达式。谢谢,我想这正是我要找的!
private string[] getWords(string text)
{
    Regex reg = new Regex("/w+");
    MatchCollection matches = reg.Matches(text);
    List<string> words = new List<string>();
    foreach (Match match in matches)
    {
        words.Add(match.Value);
    }
    return words.ToArray();
}
private string processHtml(string html, string[] words)
{
    int startPosition = 0;
    foreach (string word in words)
    {
        startPosition = html.IndexOf(word, startPosition);
        Regex reg = new Regex(word);
        html = reg.Replace(html, alterWord(word), 1, startPosition);
    }

    return html;
}