У нас есть строковое поле, которое может содержать XML или обычный текст. XML не содержит заголовка <?xml
, и ни один корневой элемент, т.е. Не сформирован правильно.
Нам нужно иметь возможность редактировать XML-данные, освобождать элементы и значения атрибутов, оставляя только их имена, поэтому мне нужно проверить, является ли эта строка XML перед ее исправлением.
В настоящее время я использую этот подход:
string redact(string eventDetail)
{
string detail = eventDetail.Trim();
if (!detail.StartsWith("<") && !detail.EndsWith(">")) return eventDetail;
...
Есть ли лучший способ?
Есть ли какие-либо краевые случаи, которые этот подход мог бы пропустить?
Я ценю, что могу использовать XmlDocument.LoadXml
и ловить XmlException
, но это похоже на дорогостоящий вариант, так как я уже знаю, что многие данные не будут в XML.
Здесь пример XML-данных, кроме отсутствующего корневого элемента (который не используется для экономии места, поскольку будет много данных), мы можем предположить, что он хорошо сформирован:
<TableName FirstField="Foo" SecondField="Bar" />
<TableName FirstField="Foo" SecondField="Bar" />
...
В настоящее время мы используем только значения, основанные на атрибутах, но мы можем использовать элементы в будущем, если данные становятся более сложными.
РЕШЕНИЕ
Основываясь на нескольких комментариях (спасибо, ребята!)
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