.net xml schema validation in the wrong namespace

The presence of an XML schema with the http://mynamespace . If an invalid XML document with the default namespace xmlns="http://mynamespace" checked, an exception is thrown as expected. If someone changes the namespace ( http://Wrongnamespace ), this invalid XML will pass validation .

Here is a unit test with a circuit check. The XSD_NotValid_2 method does not work correctly:

 [TestClass] public class XSDTest { public System.Xml.XmlReaderSettings ReaderSettings { get { string sXSD = "<xsd:schema targetNamespace=\"http://mynamespace\" xmlns=\"http://mynamespace\"" + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\">" + "<xsd:element name=\"Root\">" + "<xsd:complexType>" + "<xsd:sequence>" + "<xsd:element name=\"Child\" minOccurs=\"1\" maxOccurs=\"1\" />" + "</xsd:sequence>" + "</xsd:complexType>" + "</xsd:element>" + "</xsd:schema>"; System.Xml.Schema.XmlSchema schema = System.Xml.Schema.XmlSchema.Read(new System.IO.StringReader(sXSD) , new System.Xml.Schema.ValidationEventHandler(OnValidationFail)); System.Xml.XmlReaderSettings readerSettings_Ret = new System.Xml.XmlReaderSettings(); readerSettings_Ret.ValidationType = System.Xml.ValidationType.Schema; readerSettings_Ret.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(OnValidationFail); readerSettings_Ret.Schemas.Add(schema); return readerSettings_Ret; } } private void OnValidationFail(object s, System.Xml.Schema.ValidationEventArgs e) { throw new OperationCanceledException("Validation error: " + e.Message); } [TestMethod] public void XSD_Valid_Test() { // Valid elements and valid namespace String sXML_Valid = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<Root xmlns=\"http://mynamespace\"><Child /></Root>"; System.Xml.XmlReader xmlReader_Valid = System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_Valid), this.ReaderSettings); while (xmlReader_Valid.Read()) { } // no fail expected } [TestMethod] [ExpectedException(typeof(OperationCanceledException))] public void XSD_NotValid_1() { // No valid elements, while valid namespace String sXML_NotValid_1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<BadRoot xmlns=\"http://mynamespace\"><Child /></BadRoot>"; System.Xml.XmlReader xmlReader_NoValid_1 = System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_NotValid_1), this.ReaderSettings); while (xmlReader_NoValid_1.Read()) ; } [TestMethod] [ExpectedException(typeof(OperationCanceledException))] public void XSD_NotValid_2() { // No valid elements and no valid namespace String sXML_NotValid_2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<Root xmlns=\"http://Wrongnamespace\"><NotValidChild /></Root>"; System.Xml.XmlReader xmlReader_NoValid_2 = System.Xml.XmlReader.Create(new System.IO.StringReader(sXML_NotValid_2), this.ReaderSettings); while (xmlReader_NoValid_2.Read()) ; } } 

Is this normal behavior? How to get the right namespace targeting? And also how to make the Root element be required if the XSD has an additional Root2 element?

+4
source share
1 answer

If you enable circuit check warnings, you will receive the following error:

Could not find schema information for element 'http: // Wrongnamespace: Root'.

Use

 readerSettings_Ret.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings; 

A few little things:

  • Even in unit test, you should not create XML using string manipulations. Always use the XML API to create XML, as they know "all the rules."
  • Even in the unit test, you have to put your creation of objects that implement IDisposable in using blocks. In fact, I would say, especially in unit test, where each test should be independent of the other tests, you want to make sure that one test is cleared before starting the next.
+3
source

All Articles