Abbiamo un campo stringa che può contenere XML o testo normale. L'XML non contiene l'intestazione <?xml
e nessun elemento radice, cioè non è ben formato.Come capire se una stringa è xml?
Abbiamo bisogno di essere in grado di redigere dati XML, svuotando valori di elementi e attributi, lasciando solo il loro nome, quindi ho bisogno di verificare se questa stringa è XML prima che venga redatta.
Attualmente sto usando questo approccio:
string redact(string eventDetail)
{
string detail = eventDetail.Trim();
if (!detail.StartsWith("<") && !detail.EndsWith(">")) return eventDetail;
...
C'è un modo migliore?
Ci sono casi in cui questo approccio potrebbe mancare?
Apprezzo che potrei usare XmlDocument.LoadXml
e prendere XmlException
, ma questa sembra un'opzione costosa, poiché so già che molti dati non saranno in XML.
Ecco un esempio dei dati XML, oltre a mancare un elemento radice (che è stato omesso per risparmiare spazio, dal momento che ci saranno un sacco di dati), si può supporre che è ben formato:
<TableName FirstField="Foo" SecondField="Bar" />
<TableName FirstField="Foo" SecondField="Bar" />
...
Attualmente stiamo usando solo valori basati su attributi, ma potremmo usare elementi in futuro se i dati diventano più complessi.
SOLUZIONE
Sulla base più commenti (grazie ragazzi!)
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
Vorrei andare con LoadXml, in questo modo si sa che i dati "XML" immessi sono validi. Se si utilizza il metodo (il codice), è possibile avere XML non valido che supererà il test. – Martin
Vedere http://stackoverflow.com/questions/1072158/validate-xml-syntax-only-in-c – Graviton
Scrive tu stesso? Non capisco del tutto perché tu lo stia scrivendo in un modo in cui non puoi interpretare correttamente le aree, quindi ...? –