¿Cómo saber si una cadena es xml?

Tenemos un campo de cadena que puede contener XML o texto plano. El XML no contiene<?xml encabezado, y ningún elemento raíz, es decir, no está bien formado.

Necesitamos poder redactar datos XML, vaciar los valores de elementos y atributos, dejando solo sus nombres, por lo que debo probar si esta cadena es XML antes de que sea eliminada.

Actualmente estoy usando este enfoque:

string redact(string eventDetail)
{
    string detail = eventDetail.Trim();
    if (!detail.StartsWith("<") && !detail.EndsWith(">")) return eventDetail;
    ...

¿Hay alguna manera mejor?

¿Hay casos de ventaja que este enfoque podría pasar por alto?

Aprecio que podría usarXmlDocument.LoadXml y atraparXmlException, pero parece una opción cara, ya que sé que muchos de los datos no estarán en XML.

Aquí hay un ejemplo de los datos XML, además de perder un elemento raíz (que se omite para ahorrar espacio, ya que habrá una gran cantidad de datos), podemos asumir que está bien formado:

<TableName FirstField="Foo" SecondField="Bar" /> 
<TableName FirstField="Foo" SecondField="Bar" /> 
...

Actualmente solo estamos usando valores basados ​​en atributos, pero podemos usar elementos en el futuro si los datos se vuelven más complejos.

SOLUCIÓN

Basado en múltiples comentarios (gracias chicos!)

string redact(string eventDetail)
{
    if (string.IsNullOrEmpty(eventDetail)) return eventDetail; //+1 for unit tests :)
    string detail = eventDetail.Trim();
    if (!detail.StartsWith("<") && !detail.EndsWith(">")) return eventDetail;
    XmlDocument xml = new XmlDocument();
    try
    {
        xml.LoadXml(string.Format("<Root>{0}</Root>", detail));
    }
    catch (XmlException e)
    {
        log.WarnFormat("Data NOT redacted. Caught {0} loading eventDetail {1}", e.Message, eventDetail);
        return eventDetail;
    }
    ... // redact

Respuestas a la pregunta(7)

Su respuesta a la pregunta