如何判断字符串是否为xml?

我们有一个字符串字段,可以包含XML或纯文本。 XML不包含<?xml标头,也没有根元素,即格式不正确。

我们需要能够编辑XML数据,清空元素和属性值,只留下它们的名称,因此我需要在编辑之前测试该字符串是否为XML。

目前我正在使用这种方法:

 string redact(string eventDetail) { string detail = eventDetail.Trim(); if (!detail.StartsWith("")) return eventDetail; ... 

有没有更好的办法?

这种方法可能会遗漏任何边缘情况吗?

我很欣赏我可以使用XmlDocument.LoadXml并捕获XmlException ,但这感觉就像一个昂贵的选项,因为我已经知道很多数据不会是XML。

这是一个XML数据的例子,除了缺少一个根元素(为了节省空间而省略,因为会有很多数据),我们可以假设它是格式良好的:

   ... 

目前我们只使用基于属性的值,但如果数据变得更复杂,我们将来可能会使用元素。

基于多个评论(谢谢你!)

 string redact(string eventDetail) { if (string.IsNullOrEmpty(eventDetail)) return eventDetail; //+1 for unit tests :) string detail = eventDetail.Trim(); if (!detail.StartsWith("")) return eventDetail; XmlDocument xml = new XmlDocument(); try { xml.LoadXml(string.Format("{0}", detail)); } catch (XmlException e) { log.WarnFormat("Data NOT redacted. Caught {0} loading eventDetail {1}", e.Message, eventDetail); return eventDetail; } ... // redact 

一种可能性是混合两种解决方案。 您可以使用您的编辑方法并尝试加载它(在if中)。 这样,您只会尝试加载可能是格式正确的xml,并丢弃大多数非xml条目。

如果您首先要接受格式不正确的XML,我认为捕获exception是处理它的最佳方法。

如果您的目标是可靠性,那么最好的选择是使用XmlDocument.LoadXml来确定它是否是有效的XML。 完整的数据解析可能很昂贵,但它是可靠地判断它是否是有效XML的唯一方法。 否则,您未在缓冲区中检查的任何字符都可能导致数据为非法XML。

取决于您想要的测试准确程度。 考虑到你已经没有官方的

   

作为XML并剥离它? 如果是这样,你的技术很好。 如果没有,你必须决定你想要的测试紧密程度,并用这种程度的紧密度编码识别器。

数据是如何传递给您的? 围绕它的其他类型的数据是什么? 也许有更好的方法; 也许你可以标记你控制的数据,然后推断出那些不在这些标记内的东西是XML,但我们需要知道更多。

如果没有这样一个可爱的解决方案,我认为你拥有的很好(用于validation它是以这些角色开始和结束)。

我们需要真正了解有关数据格式的更多信息。

如果XML不包含根元素(即它是一个XML片段,而不是一个完整的文档),那么以下将是完全有效的样本 – 但是与您的检测器不匹配:

 foobaz 

实际上,任何文本字符串都是有效的XML片段(考虑原始XML文档是否只是包装一些文本的根元素,并且您将根元素标记带走)!

 try { XmlDocument myDoc = new XmlDocument(); myDoc.LoadXml(myString); } catch(XmlException ex) { //take care of the exception }