Tenemos un campo de cadena que puede contener XML o texto sin formato. El XML no contiene ningún encabezado <?xml
, y ningún elemento raíz, es decir, no está bien formado.¿Cómo saber si una cadena es xml?
Necesitamos ser capaces de redactar datos XML, elementos de vaciado y valores de atributo, dejando solo sus nombres, así que tengo que probar si esta cadena es XML antes de que se redacte.
Actualmente estoy usando este enfoque:
string redact(string eventDetail)
{
string detail = eventDetail.Trim();
if (!detail.StartsWith("<") && !detail.EndsWith(">")) return eventDetail;
...
¿Hay una mejor manera?
¿Hay algún caso extremo que este enfoque podría perderse?
Aprecio que podría usar XmlDocument.LoadXml
y atrapar XmlException
, pero esto parece una opción costosa, ya que sé que muchos de los datos no estarán en XML.
He aquí un ejemplo de los datos XML, además de la falta de un elemento raíz (que se omite para ahorrar espacio, ya que habrá una gran cantidad de datos), podemos suponer que está bien formado:
<TableName FirstField="Foo" SecondField="Bar" />
<TableName FirstField="Foo" SecondField="Bar" />
...
Actualmente, solo utilizamos valores basados en atributos, pero podemos usar elementos en el futuro si los datos se vuelven más complejos.
SOLUCIÓN
Sobre la base de varios 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
Me gustaría ir con el LoadXml, de esa manera usted sabe que los datos "XML" que se ingresaron son válidos. Si usa su método (el código), puede tener XML mal formado que pasará la prueba. – Martin
Consulte http://stackoverflow.com/questions/1072158/validate-xml-syntax-only-in-c – Graviton
¿Está escribiendo esto usted mismo? No entiendo por qué lo estás escribiendo de una manera que no puedes interpretar las áreas correctamente, entonces ...? –