你能真正找出某些东西是否会真正解析的唯一方法是……尝试解析它。
XMl 文档应该(但可能没有)在文件的开头有一个 XML 声明,在 BOM(如果存在)之后。它应该看起来像这样:
<?xml version="1.0" encoding="UTF-8" ?>
虽然我相信 encoding 属性是可选的(默认为 UTF-8。它也可能有一个standalone
值为yes
or的属性no
。如果存在,这是一个很好的指标,表明文档应该是有效的 XML。
在@GaryWalker 的出色答案上,我认为这样的事情已经非常好(尽管设置可能需要一些调整,也许是一个自定义的无操作解析器)。只是为了好玩,我使用 XMark xmlgen
( http://www.xml-benchmark.org/ ) 生成了一个 300mb 的随机 XML 文件:在我的台式机上使用下面的代码验证它需要 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 = "<foo>This &SomeEntity; is about as simple as it gets.</foo>" ;
Stream stream = new MemoryStream( Encoding.UTF8.GetBytes(text) ) ;
bool isValid = IsMinimallyValidXml( stream ) ;
return ;
}