Вы должны разобрать его, отыскивая пустые элементы span и заменяя их. Вот как вы можете сделать это, используя LINQ to XML. Просто обратите внимание, что в зависимости от фактического HTML может потребоваться настройка, чтобы заставить его работать, поскольку он является синтаксическим анализатором XML, а не HTML.
// parse it
var doc = XElement.Parse(theHtml);
// find the target elements
var targets = doc.DescendantNodes()
.OfType<XElement>()
.Where(e => e.Name.Equals("span", StringComparison.OrdinalIgnoreCase)
&& e.IsEmpty
&& !e.HasAttributes)
.ToList(); // need a copy since the contents will change
// replace them all
foreach (var span in targets)
span.ReplaceWith(new XElement("br"));
// get back the html string
theHtml = doc.ToString();
В противном случае, вот некоторый код, показывающий, как вы можете использовать HTML Agility Pack для того же (написано так, что отражает другую версию).
// parse it
var doc = new HtmlDocument();
doc.LoadHtml(theHtml);
// find the target elements
var targets = doc.DocumentNode
.DescendantNodes()
.Where(n => n.NodeType == HtmlNodeType.Element
&& n.Name.Equals("span", StringComparison.OrdinalIgnoreCase)
&& !n.HasChildNodes && !n.HasAttributes)
.ToList(); // need a copy since the contents will change
// replace them all
foreach (var span in targets)
{
var br = HtmlNode.CreateNode("<br />");
span.ParentNode.ReplaceChild(br, span);
}
// get back the html string
using (StringWriter writer = new StringWriter())
{
doc.Save(writer);
theHtml = writer.ToString();
}