Here is my function.
If you pass MemoryStream to XmlReader it does not validate proper xml files sometimes. I have the XmlDocument object stored in memory, I want to validate it against the xsd Schema files provided by the end user.
ValidateSchema1(string XMLPath, string XSDPath)
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(XMLPath);
using (MemoryStream mstream = new MemoryStream())
{
//StreamWriter writer = new StreamWriter(mstream);
xmlDocument.Save(mstream);
mstream.Seek(0, SeekOrigin.Begin);
XmlSchemaSet sc = new XmlSchemaSet();
// Add the schema to the collection.
sc.Add(null, XSDPath);
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas = sc;
settings.ValidationEventHandler += ValidationCallBack;
// Create the XmlReader object.
// Not woking
XmlReader reader = XmlReader.Create(mstream, settings);
// Working
//XmlReader reader = XmlReader.Create(new StringReader(xmlDocument.InnerXml), settings);
// Working
//XmlReader reader = XmlReader.Create(XMLPath, settings);
// Parse the file.
while (reader.Read()) ;
}
}
This might work:
http://www.experts-exchange.com/Programming/Languages/.NET/Visual_CSharp/Q_23387252.html
This works
How to validate, on runtime, xml against xsd without save the xsd file on local folder?
Edit 1: Fixed the code you provided, now the code works as it should, validated 2 of my files. The reason why you got the error is the fact that you where trying to validate and Xsd with itself and the root element wasn't there. Please check the solution to see for yourself.
public void Xsd_whithout_saved()
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"file.xsd");
//In the futute, strArquivoInteiro will be fullfill by xsd comming from database as nvarchar(max) and I will //not be allowed to save as a file locally
string strArquivoInteiro = xmlDoc.OuterXml;
byte[] byteArray = Encoding.ASCII.GetBytes(strArquivoInteiro);
MemoryStream streamXSD = new MemoryStream(byteArray);
//<<<
streamXSD.Position = 0;
StreamReader readerXsd = new StreamReader(streamXSD);
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationEventHandler += this.MyValidationEventHandler;
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add(null, XmlReader.Create(readerXsd));
settings.CheckCharacters = true;
XmlReader XmlValidatingReader = XmlReader.Create(@"file.xml", settings);
XmlTextReader Reader = new XmlTextReader(@"file.xsd");
//Created another reader for xml to use for validation
XmlTextReader Reader2 = new XmlTextReader(@"file.xml");
XmlSchema Schema = new XmlSchema();
//IN THIS LINE I RECEIVED THE XmlException "Root Element is Missing" and I can't understand the reason
//This was the first problem, a xsd root element isn't equal to an xml root element , and you where trying to validate and xsd with xsd here, and of course the error.
Schema = XmlSchema.Read(Reader, MyValidationEventHandler);
XmlValidatingReader ValidatingReader = new XmlValidatingReader(Reader2);
ValidatingReader.ValidationType = ValidationType.Schema;
ValidatingReader.Schemas.Add(Schema);
try
{
XmlValidatingReader.Read();
XmlValidatingReader.Close();
ValidatingReader.ValidationEventHandler += MyValidationEventHandler;
while ((ValidatingReader.Read()))
{
}
ValidatingReader.Close();
}
catch (Exception ex)
{
ValidatingReader.Close();
XmlValidatingReader.Close();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With