.NET : How to validate XML file with DTD without DOCTYPE declaration

后端 未结 3 824
無奈伤痛
無奈伤痛 2021-01-12 02:12

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.         


        
相关标签:
3条回答
  • 2021-01-12 02:44

    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;
    }
    
    0 讨论(0)
  • 2021-01-12 02:45

    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?

    0 讨论(0)
  • 2021-01-12 03:03
    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);
    }
    
    0 讨论(0)
提交回复
热议问题