Являются ли данные собственно XML или они просто выглядят так?
Если это HTML, то HTML Agility Pack заслуживает изучения - он предоставляет DOM (аналог XmlDocument), который можно использовать для запроса данных:
string input = @"<html>...some html content <b> etc </b> ...
<user> hello <b>mitch</b> </user>
...some html content <b> etc </b> ...
<message> some html <i>message</i> <a href....>bla</a> </message>
...some html content <b> etc </b> ...</html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(input);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//user | //message"))
{
Console.WriteLine("{0}: {1}", node.Name, node.InnerText);
// or node.InnerHtml to keep the formatting within the content
}
Это выводит:
user: hello mitch
message: some html message bla
Если вам нужны теги форматирования, используйте .InnerHtml вместо .InnerText.
Если это xml, то для кодирования с полным спектром xml было бы лучше использовать анализатор xml. Для xml малого и среднего размера загрузка его в DOM, например, XmlDocument, будет хорошей, а затем запросит узлы (например, «// *»). Для огромного XML, XmlReader может быть вариантом.
Если данные не должны беспокоиться о полном XML, то некоторое простое регулярное выражение не должно быть слишком сложным ... упрощенный пример (без атрибутов, без пространств имен, без вложенного XML) может быть:
string input = @"blah <tag1> content for tag 1 </tag1> blop
<tag2> content for tag 2 </tag2> bloop
<tag3> content for tag 3 </tag3> blip";
const string pattern = @"<(\w+)>\s*([^<>]*)\s*</(\1)>";
Console.WriteLine(Regex.IsMatch(input, pattern));
foreach(Match match in Regex.Matches(input, pattern)) {
Console.WriteLine("{0}: {1}", match.Groups[1], match.Groups[2]);
}