У нас есть поле строки, которое может содержать XML или обычный текст. 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
Я бы пошел с LoadXml, так что вы знаете, что введенные данные «XML» действительны. Если вы используете свой метод (код), у вас может быть неверный XML, который пройдет тест. – Martin
См. Http://stackoverflow.com/questions/1072158/validate-xml-syntax-only-in-c – Graviton
Вы пишете это самостоятельно? Я не совсем понимаю, почему вы пишете его так, как вы не можете правильно интерпретировать области, тогда ...? –