いくつかの単純な文字列操作を試すことができます。追加の名前空間やツールは含まれていません。
この例を参照してください。問題が解決する可能性があります。
string html = string.Concat("<p class=\"foo\">",
"<p class=\"bar\">",
"<p>",
"</br>",
"<P>",
"</BR>"); // tags can be upper case as well
string strAux = html;
int tagOpenedAt=-1, tagClosedAt=-1;
bool isError = false;
do
{
tagOpenedAt = strAux.IndexOf('<');
tagClosedAt = strAux.IndexOf('>');
if(tagOpenedAt<tagClosedAt)
{
string fullTag = strAux.Substring(tagOpenedAt, tagClosedAt - tagOpenedAt + 1);
//<p> --> <Paragraph>
if (fullTag.ToLower().Equals("<p>") || fullTag.ToLower().StartsWith("<p "))
html = html.Replace(fullTag, "<Paragraph>");
//</br> --> <LineBreak/>
if (fullTag.ToLower().Equals("</br>"))
html = html.Replace(fullTag, "<LineBreak/>");
//more if conditions as you need them
strAux = strAux.Substring(tagClosedAt + 1);
}
else
{
isError = true;
}
}
while (tagOpenedAt>-1 && tagClosedAt>-1 && !isError);
悪いコードで申し訳ありません。.ToLower()をすべてのifステートメントではなく 1 回実行するだけで改善できるかもしれません。また、悪いタグをチェックしませんでした。コードは html が有効であると想定しているだけです。
ちょっとだけ編集
string html = string.Concat("<p class=\"foo\">","\n",
"<p class=\"bar\">", "\n",
"<p>", "\n",
"</br>", "\n",
"<P>", "\n",
"</BR>");
Console.WriteLine("HTML is :\n{0}\n", html);
string strAux = html;
int tagOpenedAt=-1, tagClosedAt=-1;
bool isError = false;
do
{
tagOpenedAt = strAux.IndexOf('<');
tagClosedAt = strAux.IndexOf('>');
if(tagOpenedAt < tagClosedAt)
{
string _fullTag = strAux.Substring(tagOpenedAt, tagClosedAt - tagOpenedAt + 1);
string _lower = _fullTag.ToLower();
string _replace = null;
//<p> --> <Paragraph>
if (_lower.Equals("<p>") || _lower.StartsWith("<p "))
_replace = "<Paragraph>";
//</br> --> <LineBreak/>
if (_lower.Equals("</br>"))
_replace = "<LineBreak/>";
//more if conditions as you need them
if(_replace != null)
{
html = html.Replace(_fullTag, _replace);
Console.WriteLine("Replaced {0} with {1}", _fullTag, _replace);
}
strAux = strAux.Substring(tagClosedAt + 1);
}
else
{
isError = true;
}
}
while (tagOpenedAt>-1 && tagClosedAt>-1 && !isError);
Console.WriteLine("\nNew html is :\n{0}",html);