Вместо того, чтобы думать об этом как о строке, рассмотрите возможность использования LINQ to XML для генерации узлов:
var rows = from row in targetTable.Rows.AsEnumerable()
select new XElement("tr",
new XAttribute("align", "left"),
new XAttribute("valign","top"),
from column in targetTable.Columns.AsEnumerable()
select new XElement("td",
new XAttribute("align", "left"),
new XAttribute("valign", "top"),
myRow[targetColumn.ColumnName].ToString()
)
);
Перевод этого в синтаксис лямбды:
var rows = targetTable.Rows.AsEnumerable().Select(row => new XElement("tr",
new XAttribute("align", "left"),
new XAttribute("valign","top"),
targetTable.Columns.AsEnumerable().Select(column => new XElement("td",
new XAttribute("align", "left"),
new XAttribute("valign", "top"),
myRow[targetColumn.ColumnName].ToString()
))
));
Если вам нужен результат в виде строки. Просто вызовите ToString () для строк.
Одним из основных преимуществ представления XML как использования строителя строк является то, что вы будете правильно экранировать недопустимые строки, такие как <> & ", и в результате получите правильный XHtml.