.NET: come convalidare il file XML con DTD senza dichiarazione DOCTYPE

Ho un file XML senza dichiarazione DOCTYPE che mi piacerebbe convalidare con una DTD esterna al momento della lettura.

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) 

Come si imposta il percorso per tale DTD esterno? Come si convalida?

Ho usato con successo la seguente funzione, che dovrebbe essere facile da adattare. Come mai questo si basa sulla creazione di un XmlDocument come magnifico menzionato. Questo può essere ottenuto da:

 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; } 

Potresti creare un Xml.XmlDocument con la DTD che desideri, quindi aggiungere i dati del file XML al file Xml.XmlDocument in-memory, quindi convalidarlo?

 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); }