我正在使用C#和HTML Agility Pack的.NEt 4.5版本。我必须能够导入大量不同的html文档,并始终能够将它们加载到.NET XmlDocument中。
我目前的问题是我看到类似的HTML:
<p class="s18">(4) if qual. ch ild <17 f or</p>
我需要转换那个&#34;&lt;&#34;其他任何事情,但我需要保留所有其他&lt;&s;和&gt;&#39; s。我希望尽可能少地使用代码行,并希望有人能告诉我如何利用Html Agility Pack(已经在我的项目中用于其他事情)来解决这个问题。
编辑:如果Html Agility Pack不能满足需要,那么我会欣赏一种C#方法,它会在保留任何有效标签的同时消除或关闭任何打开的标志。
编辑2:删除,不再相关。
编辑3:我已经部分解决了这个问题,但是有一个错误,我很感激帮助解决。
我的方法如下。此方法成功删除了&#39;&#39;和&#39;&gt;&#39;此HTML中的字符。
<p>yo hi</p><p> Gee I love 1<'s</p><td name=\"\" /><p>bazinga ></p>
我遇到的问题是Regex.Matches()方法似乎实际上找不到所有匹配项。它将找到一个匹配,然后查找下一场比赛,在第一场比赛结束后定位。这种行为使得&#34;我喜欢2&#34; &#39;&LT;&#39;在以下HTML中跳过字符。
<p>yo hi</p><p> Gee I love 1<'s<p> Gee I love 2<'s<p> Gee I love 3<'s</p></p></p><td name=\"\" /><p>bazinga ></p>
在我看来&#34;我喜欢2&#34;应该是匹配,但Regex.Matches()方法正在跳过它,因为我认为,位置位置被向前移动到最后一场比赛的结尾。
private static string RemovePartialTags(string input)
{
Regex regex = new Regex(@"<[^<>/]+>(.*?)<[^<>]+>");
string output = regex.Replace(input, delegate(Match m)
{
string v = m.Value;
Regex reg = new Regex(@"<[^<>]+>");
MatchCollection matches = reg.Matches(v);
int locEndTag = v.IndexOf(matches[1].Value);
List<string> tokens = new List<string>
{
v.Substring(0, matches[0].Length),
v.Substring(matches[0].Length, locEndTag - matches[0].Length)
.Replace(@"<", string.Empty)
.Replace(@">", string.Empty)
};
tokens.Add(v.Substring(tokens[0].Length + (locEndTag - matches[0].Length)));
return tokens[0] + tokens[1] + tokens[2];
}
);
return output;
}
提前谢谢!
答案 0 :(得分:0)
我通过使用与上面相同的方法但使用修改的正则表达式
解决了我的问题@"<[^<>/]+>(.*?)[<](.*?)<[^<>]+>"
方法:
private static string RemovePartialTags(string input)
{
Regex regex = new Regex(@"<[^<>/]+>(.*?)[<](.*?)<[^<>]+>");
string output = regex.Replace(input, delegate(Match m)
{
string v = m.Value;
Regex reg = new Regex(@"<[^<>]+>");
MatchCollection matches = reg.Matches(v);
int locEndTag = v.IndexOf(matches[1].Value);
List<string> tokens = new List<string>
{
v.Substring(0, matches[0].Length),
v.Substring(matches[0].Length, locEndTag - matches[0].Length)
.Replace(@"<", string.Empty)
.Replace(@">", string.Empty)
};
tokens.Add(v.Substring(tokens[0].Length + (locEndTag - matches[0].Length)));
return tokens[0] + tokens[1] + tokens[2];
}
);
return output;
}