测试C#中的某些东西是否是可解析的XML

有没有人知道在C#中检查字符串是否可解析为XML的快速方法? 最好是一些快速,低资源的东西,它会返回一个布尔值,无论它是否会解析。

我正在开发一个数据库应用程序来处理有时存储为XML的错误,有时则不会。 因此,我希望能够非常快速地测试我从数据库中获取的字符串(包含在DataTable中)…而不必诉诸任何try / catch {}语句或其他kludges …除非这些是实现这一目标的唯一途径。

听起来你有时会回复XML,有时你会回到“普通”(非XML)文本。

如果是这种情况,您可以检查文本是否以<

 if (!string.IsNullOrEmpty(str) && str.TrimStart().StartsWith("<")) var doc = XDocumment.Parse(str); 

由于“普通”消息似乎不太可能以<这可能是合理的。 您唯一需要决定的是,在边缘情况下您要使用以< ?开头的非XML文本。

如果是我,我会默认尝试解析它并捕获exception:

 if (!string.IsNullOrEmpty(str) && str.TrimStart().StartsWith("<")) { try { var doc = XDocumment.Parse(str); return //??? } catch(Exception ex) return str; } else { return str; } 

这样,只有当你有一个以<但不是有效的XML开头的消息时,你才能获得抛出exception的开销。

您可以尝试将字符串解析为XDocument。 如果它无法解析,那么您知道它无效。

 string xml = ""; XDocument document = XDocument.Parse(xml); 

如果你不想让丑陋的try / catch可见,你可以把它扔到字符串类的扩展方法中……

 public static bool IsValidXml(this string xml) { try { XDocument.Parse(xml); return true; } catch { return false; } } 

然后你的代码看起来像if (mystring.IsValidXml()) {

你能真正发现某些东西是否会真正解析的唯一方法是…尝试解析它。

XMl文档应该 (但可能不)在文件的头部有一个XML声明,遵循BOM(如果存在)。 它应该看起来像这样:

  

虽然我认为编码属性是可选的(默认为UTF-8。它也可能有一个standalone属性,其值为yesno 。如果存在,那么这是一个非常好的指示,该文档应该是有效的XML 。

关于@GaryWalker的优秀答案 ,我觉得(尽管设置可能需要一些调整,也许是定制的无操作解析器),这样的事情就像它得到的一样好。 只是为了踢,我使用xmlgenhttp://www.xml-benchmark.org/ )生成了一个300mb的随机XML文件:使用下面的代码validation它在我的台式机上花了1.7-1.8秒的时间。

 public static bool IsMinimallyValidXml( Stream stream ) { XmlReaderSettings settings = new XmlReaderSettings { CheckCharacters = true , ConformanceLevel = ConformanceLevel.Document , DtdProcessing = DtdProcessing.Ignore , IgnoreComments = true , IgnoreProcessingInstructions = true , IgnoreWhitespace = true , ValidationFlags = XmlSchemaValidationFlags.None , ValidationType = ValidationType.None , } ; bool isValid ; using ( XmlReader xmlReader = XmlReader.Create( stream , settings ) ) { try { while ( xmlReader.Read() ) { ; // This space intentionally left blank } isValid = true ; } catch (XmlException) { isValid = false ; } } return isValid ; } static void Main( string[] args ) { string text = "This &SomeEntity; is about as simple as it gets." ; Stream stream = new MemoryStream( Encoding.UTF8.GetBytes(text) ) ; bool isValid = IsMinimallyValidXml( stream ) ; return ; } 

对于我所知道的测试格式良好的XML,我看起来最好的答案是以编程方式检查C#中XML文件格式良好的最快方法是什么? formaness-of-xml-file“它涵盖了使用XMLReader有效地执行此操作。

确定XML是否有效的方法并不多。 我基本上做了两个步骤。

检查它是否以所需的XML标记开头(类似于)

 bool result = xmlToParse.BeginsWith(" 

然后确保有相等的<> (类似的东西)

 result = xmlToParse.Count(c => c == '<') == xmlToParse.Count(c => c == '>'); 

除了基本检查之外,它变成了一个实际上熟悉XML的进程(非正则表达式),以保证它将解析。