.NET:如何在没有DOCTYPE声明的情况下使用DTDvalidationXML文件

我有一个没有DOCTYPE声明的XML文件,我想在读取时使用外部DTDvalidation。

Dim x_set As Xml.XmlReaderSettings = New Xml.XmlReaderSettings() x_set.XmlResolver = Nothing x_set.CheckCharacters = False x_set.ProhibitDtd = False x = XmlTextReader.Create(sChemin, x_set) 

如何设置外部DTD的路径? 你如何validation?

我以前成功使用过以下function,应该很容易适应。 然而,这依赖于创建一个XmlDocument作为magnifico提到。 这可以通过以下方式实现:

 XmlDocument doc = new XmlDocument(); doc.Load( filename ); doc.InsertBefore( doc.CreateDocumentType( "doc_type_name", null, DtdFilePath, null ), doc.DocumentElement ); ///  /// Class to test a document against DTD ///  /// XML The document to validate private static bool ValidateDoc( XmlDocument doc ) { bool isXmlValid = true; StringBuilder xmlValMsg = new StringBuilder(); StringWriter sw = new StringWriter(); doc.Save( sw ); doc.Save( TestFilename ); XmlReaderSettings settings = new XmlReaderSettings(); settings.ProhibitDtd = false; settings.ValidationType = ValidationType.DTD; settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings; settings.ValidationEventHandler += new ValidationEventHandler( delegate( object sender, ValidationEventArgs args ) { isXmlValid = false; xmlValMsg.AppendLine( args.Message ); } ); XmlReader validator = XmlReader.Create( new StringReader( sw.ToString() ), settings ); while( validator.Read() ) { } validator.Close(); string message = xmlValMsg.ToString(); return isXmlValid; } 

你能用你想要的DTD创建一个Xml.XmlDocument,然后将XML文件数据附加到内存中的Xml.XmlDocument,然后validation吗?

 private static bool _isValid = true; static void Main(string[] args) { using (MemoryStream ms = new MemoryStream()) { using (FileStream file = new FileStream("C:\\MyFolder\\Product.dtd", FileMode.Open, FileAccess.Read)) { byte[] bytes = new byte[file.Length]; file.Read(bytes, 0, (int) file.Length); ms.Write(bytes, 0, (int) file.Length); } using (FileStream file = new FileStream("C:\\MyFolder\\Product.xml", FileMode.Open, FileAccess.Read)) { byte[] bytes = new byte[file.Length]; file.Read(bytes, 0, (int) file.Length); ms.Write(bytes, 0, (int) file.Length); } ms.Position = 0; var settings = new XmlReaderSettings(); settings.DtdProcessing = DtdProcessing.Parse; settings.ValidationType = ValidationType.DTD; settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent); var reader = XmlReader.Create(ms, settings); // Parse the file. while (reader.Read()) ; } // Check whether the document is valid or invalid. if (_isValid) Console.WriteLine("Document is valid"); else Console.WriteLine("Document is invalid"); } private static void OnValidationEvent(object obj, ValidationEventArgs args) { _isValid = false; Console.WriteLine("Validation event\n" + args.Message); }