tags:

views:

2816

answers:

2

I have an XML file with no DOCTYPE declaration that I would like to validate with an external DTD upon reading.

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)

How do you set the path for that external DTD? How do you validate?

A: 

Could you create an Xml.XmlDocument with the DTD you want, then append the XML file data to the in-memory Xml.XmlDocument, then validate that?

magnifico
+2  A: 

I have used the following function successfully before, which should be easy to adapt. How ever this relies on creating a XmlDocument as magnifico mentioned. This can be achieved by:

XmlDocument doc = new XmlDocument();
doc.Load( filename );
doc.InsertBefore( doc.CreateDocumentType( "doc_type_name", null, DtdFilePath, null ), 
 doc.DocumentElement );


/// <summary>
/// Class to test a document against DTD
/// </summary>
/// <param name="doc">XML The document to validate</param>
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;
}
bstoney