public void DefaultValueForXmlResolver_XmlUrlResolver() { XmlNamespaceManager manager = new XmlNamespaceManager(new NameTable()); manager.AddNamespace("t", "uri:tempuri"); XmlSchemaValidator val = new XmlSchemaValidator(new NameTable(), CreateSchemaSetFromXml("<root />"), manager, AllFlags); XmlSchemaInfo info = new XmlSchemaInfo(); val.XmlResolver = new XmlUrlResolver(); //Adding this as the default resolver is null and not XmlUrlResolver anymore val.Initialize(); val.ValidateElement("foo", "", null, "t:type1", null, "uri:tempuri " + TestData + XSDFILE_TARGET_NAMESPACE, null); val.ValidateEndOfAttributes(null); val.ValidateElement("bar", "", null); val.ValidateEndOfAttributes(null); val.ValidateEndElement(null); val.ValidateEndElement(info); Assert.Equal(info.ContentType, XmlSchemaContentType.ElementOnly); Assert.True(info.SchemaType != null); return; }
public void XsdAnyToSkipAttributeValidation () { // bug #358408 XmlSchemaSet schemas = new XmlSchemaSet (); schemas.Add (null, "Test/XmlFiles/xsd/358408.xsd"); XmlSchemaValidator v = new XmlSchemaValidator ( new NameTable (), schemas, new XmlNamespaceManager (new NameTable ()), XmlSchemaValidationFlags.ProcessIdentityConstraints); v.Initialize (); v.ValidateWhitespace (" "); XmlSchemaInfo info = new XmlSchemaInfo (); ArrayList list = new ArrayList (); v.ValidateElement ("configuration", "", info, null, null, null, null); v.GetUnspecifiedDefaultAttributes (list); v.ValidateEndOfAttributes (info); v.ValidateWhitespace (" "); v.ValidateElement ("host", "", info, null, null, null, null); v.ValidateAttribute ("auto-start", "", "true", info); list.Clear (); v.GetUnspecifiedDefaultAttributes (list); v.ValidateEndOfAttributes (info); v.ValidateEndElement (null);//info); v.ValidateWhitespace (" "); v.ValidateElement ("service-managers", "", info, null, null, null, null); list.Clear (); v.GetUnspecifiedDefaultAttributes (list); v.ValidateEndOfAttributes (info); v.ValidateWhitespace (" "); v.ValidateElement ("service-manager", "", info, null, null, null, null); list.Clear (); v.GetUnspecifiedDefaultAttributes (list); v.ValidateEndOfAttributes (info); v.ValidateWhitespace (" "); v.ValidateElement ("foo", "", info, null, null, null, null); v.ValidateAttribute ("bar", "", "", info); }
public void XmlSchemaValidatorDoesNotEnforceIdentityConstraintsOnDefaultAttributesInSomeCases() { Initialize(); string xml = @"<?xml version='1.0'?> <root xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='idF016.xsd'> <uid val='test'/> <uid/></root>"; string xsd = @"<?xml version='1.0'?> <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'> <xsd:element name='root'> <xsd:complexType> <xsd:sequence> <xsd:element ref='uid' maxOccurs='unbounded'/> </xsd:sequence> </xsd:complexType> <xsd:unique id='foo123' name='uuid'> <xsd:selector xpath='.//uid'/> <xsd:field xpath='@val'/> </xsd:unique> </xsd:element> <xsd:element name='uid' nillable='true'> <xsd:complexType> <xsd:attribute name='val' type='xsd:string' default='test'/> </xsd:complexType> </xsd:element> </xsd:schema>"; XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable()); XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add(null, XmlReader.Create(new StringReader(xsd))); schemas.Compile(); XmlSchemaValidationFlags validationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.AllowXmlAttributes; XmlSchemaValidator validator = new XmlSchemaValidator(namespaceManager.NameTable, schemas, namespaceManager, validationFlags); validator.Initialize(); using (XmlReader r = XmlReader.Create(new StringReader(xsd))) { while (r.Read()) { switch (r.NodeType) { case XmlNodeType.Element: namespaceManager.PushScope(); if (r.MoveToFirstAttribute()) { do { if (r.NamespaceURI == "http://www.w3.org/2000/xmlns/") { namespaceManager.AddNamespace(r.LocalName, r.Value); } } while (r.MoveToNextAttribute()); r.MoveToElement(); } validator.ValidateElement(r.LocalName, r.NamespaceURI, null, null, null, null, null); if (r.MoveToFirstAttribute()) { do { if (r.NamespaceURI != "http://www.w3.org/2000/xmlns/") { validator.ValidateAttribute(r.LocalName, r.NamespaceURI, r.Value, null); } } while (r.MoveToNextAttribute()); r.MoveToElement(); } validator.ValidateEndOfAttributes(null); if (r.IsEmptyElement) goto case XmlNodeType.EndElement; break; case XmlNodeType.EndElement: validator.ValidateEndElement(null); namespaceManager.PopScope(); break; case XmlNodeType.Text: validator.ValidateText(r.Value); break; case XmlNodeType.SignificantWhitespace: case XmlNodeType.Whitespace: validator.ValidateWhitespace(r.Value); break; default: break; } } validator.EndValidation(); } XmlReaderSettings rs = new XmlReaderSettings(); rs.ValidationType = ValidationType.Schema; rs.Schemas.Add(null, XmlReader.Create(new StringReader(xsd))); using (XmlReader r = XmlReader.Create(new StringReader(xml), rs)) { try { while (r.Read()) ; } catch (XmlSchemaValidationException e) { _output.WriteLine(e.Message); return; } } Assert.True(false); }
public void StringPassedToValidateEndElementDoesNotSatisfyIdentityConstraints() { Initialize(); string xsd = "<xs:schema targetNamespace='http://tempuri.org/XMLSchema.xsd' elementFormDefault='qualified' xmlns='http://tempuri.org/XMLSchema.xsd' xmlns:mstns='http://tempuri.org/XMLSchema.xsd' xmlns:xs='http://www.w3.org/2001/XMLSchema'>" + "<xs:element name='root'>" + "<xs:complexType> <xs:sequence> <xs:element name='B' type='mstns:B'/> </xs:sequence> </xs:complexType>" + "<xs:unique name='pNumKey'><xs:selector xpath='mstns:B/mstns:part'/><xs:field xpath='.'/></xs:unique>" + "</xs:element>" + "<xs:complexType name='B'><xs:sequence><xs:element name='part' maxOccurs='unbounded' type='xs:string'></xs:element></xs:sequence></xs:complexType>" + "</xs:schema>"; XmlSchemaSet ss = new XmlSchemaSet(); ss.Add(XmlSchema.Read(new StringReader(xsd), ValidationCallback)); ss.Compile(); string ns = "http://tempuri.org/XMLSchema.xsd"; XmlNamespaceManager nsmgr = new XmlNamespaceManager(ss.NameTable); XmlSchemaValidator val = new XmlSchemaValidator(ss.NameTable, ss, nsmgr, XmlSchemaValidationFlags.ProcessIdentityConstraints); val.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); val.Initialize(); XmlSchemaInfo si = new XmlSchemaInfo(); val.ValidateElement("root", ns, si); val.ValidateEndOfAttributes(si); val.ValidateElement("B", ns, si); val.ValidateEndOfAttributes(si); val.ValidateElement("part", ns, si); val.ValidateEndOfAttributes(si); val.ValidateText("1"); val.ValidateEndElement(si); val.ValidateElement("part", ns, si); val.ValidateEndOfAttributes(si); val.ValidateEndElement(si, "1"); val.ValidateElement("part", ns, si); val.ValidateEndOfAttributes(si); val.ValidateText("1"); val.ValidateEndElement(si); val.ValidateEndElement(si); val.ValidateEndElement(si); Assert.Equal(warningCount, 0); Assert.Equal(errorCount, 2); return; }
public void ValidateWithXmlReader(XmlSchemaSet schemas, string xml, string xsd) { XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable()); XmlSchemaValidationFlags validationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.AllowXmlAttributes; XmlSchemaValidator validator = new XmlSchemaValidator(namespaceManager.NameTable, schemas, namespaceManager, validationFlags); validator.Initialize(); using (XmlReader r = XmlReader.Create(xsd)) { while (r.Read()) { switch (r.NodeType) { case XmlNodeType.Element: namespaceManager.PushScope(); if (r.MoveToFirstAttribute()) { do { if (r.NamespaceURI == "http://www.w3.org/2000/xmlns/") { namespaceManager.AddNamespace(r.LocalName, r.Value); } } while (r.MoveToNextAttribute()); r.MoveToElement(); } validator.ValidateElement(r.LocalName, r.NamespaceURI, null, null, null, null, null); if (r.MoveToFirstAttribute()) { do { if (r.NamespaceURI != "http://www.w3.org/2000/xmlns/") { validator.ValidateAttribute(r.LocalName, r.NamespaceURI, r.Value, null); } } while (r.MoveToNextAttribute()); r.MoveToElement(); } validator.ValidateEndOfAttributes(null); if (r.IsEmptyElement) goto case XmlNodeType.EndElement; break; case XmlNodeType.EndElement: validator.ValidateEndElement(null); namespaceManager.PopScope(); break; case XmlNodeType.Text: validator.ValidateText(r.Value); break; case XmlNodeType.SignificantWhitespace: case XmlNodeType.Whitespace: validator.ValidateWhitespace(r.Value); break; default: break; } } validator.EndValidation(); } XmlReaderSettings rs = new XmlReaderSettings(); rs.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); rs.ValidationType = ValidationType.Schema; rs.Schemas.XmlResolver = new XmlUrlResolver(); rs.Schemas.Add(null, XmlReader.Create(xsd)); using (XmlReader r = XmlReader.Create(xml, rs)) { while (r.Read()) ; } Assert.Equal(warningCount, 0); Assert.Equal(errorCount, 0); }
public void ValidateWithSchemaInfo(XmlSchemaSet ss) { string ns = "http://tempuri.org/XMLSchema.xsd"; XmlNamespaceManager nsmgr = new XmlNamespaceManager(ss.NameTable); XmlSchemaValidator val = new XmlSchemaValidator(ss.NameTable, ss, nsmgr, XmlSchemaValidationFlags.ProcessIdentityConstraints); val.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); val.Initialize(); XmlSchemaInfo si = new XmlSchemaInfo(); val.ValidateElement("root", ns, si); val.ValidateEndOfAttributes(si); val.ValidateElement("B", ns, si); val.ValidateEndOfAttributes(si); val.ValidateElement("part", ns, si); val.ValidateEndOfAttributes(si); val.ValidateText("1"); val.ValidateEndElement(si); val.ValidateElement("part", ns, si); val.ValidateEndOfAttributes(si); val.ValidateEndElement(si, "1"); val.ValidateElement("part", ns, si); val.ValidateEndOfAttributes(si); val.ValidateText("1"); val.ValidateEndElement(si); val.ValidateEndElement(si); val.ValidateEndElement(si); Assert.Equal(warningCount, 0); Assert.Equal(errorCount, 0); }
private XmlSchemaObject GetTypeFromAncestors(XmlElement elementToValidate, XmlSchemaObject ancestorType, int ancestorsCount) { //schemaInfo is currentNode's schemaInfo _validator = CreateTypeFinderValidator(ancestorType); _schemaInfo = new XmlSchemaInfo(); //start at the ancestor to start validating int startIndex = ancestorsCount - 1; bool ancestorHasWildCard = AncestorTypeHasWildcard(ancestorType); for (int i = startIndex; i >= 0; i--) { XmlNode node = _nodeSequenceToValidate[i]; XmlElement currentElement = node as XmlElement; ValidateSingleElement(currentElement, false, _schemaInfo); if (!ancestorHasWildCard) { //store type if ancestor does not have wildcard in its content model currentElement.XmlName = _document.AddXmlName(currentElement.Prefix, currentElement.LocalName, currentElement.NamespaceURI, _schemaInfo); //update wildcard flag ancestorHasWildCard = AncestorTypeHasWildcard(_schemaInfo.SchemaElement); } _validator.ValidateEndOfAttributes(null); if (i > 0) { ValidateChildrenTillNextAncestor(node, _nodeSequenceToValidate[i - 1]); } else { //i == 0 ValidateChildrenTillNextAncestor(node, elementToValidate); } } Debug.Assert(_nodeSequenceToValidate[0] == elementToValidate.ParentNode); //validate element whose type is needed, ValidateSingleElement(elementToValidate, false, _schemaInfo); XmlSchemaObject schemaInfoFound = null; if (_schemaInfo.SchemaElement != null) { schemaInfoFound = _schemaInfo.SchemaElement; } else { schemaInfoFound = _schemaInfo.SchemaType; } if (schemaInfoFound == null) { //Detect if the node was validated lax or skip if (_validator.CurrentProcessContents == XmlSchemaContentProcessing.Skip) { if (_isPartialTreeValid) { //Then node assessed as skip; if there was error we turn processContents to skip as well. But this is not the same as validating as skip. return XmlSchemaComplexType.AnyTypeSkip; } } else if (_validator.CurrentProcessContents == XmlSchemaContentProcessing.Lax) { return XmlSchemaComplexType.AnyType; } } return schemaInfoFound; }