<?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