Please do not reply to this email- if you want to comment on the bug, go to the URL shown below and enter your comments there.
Changed by [EMAIL PROTECTED] http://bugzilla.ximian.com/show_bug.cgi?id=76925 --- shadow/76925 2005-12-05 18:16:39.000000000 -0500 +++ shadow/76925.tmp.31225 2005-12-05 18:16:39.000000000 -0500 @@ -0,0 +1,181 @@ +Bug#: 76925 +Product: Mono: Class Libraries +Version: 1.1 +OS: +OS Details: +Status: NEW +Resolution: +Severity: +Priority: Normal +Component: Sys.XML +AssignedTo: [EMAIL PROTECTED] +ReportedBy: [EMAIL PROTECTED] +QAContact: [EMAIL PROTECTED] +TargetMilestone: --- +URL: +Cc: +Summary: XmlSchemas.Find fails to find name present in Added schemas + +Please fill in this template when reporting a bug, unless you know what you +are doing. +Description of Problem: +The System.Xml.Serialization.XmlSchemas class object Find (XmlQualifiedName +name, Type type) method fails to find the name under some circumstances. +Specifically, if two schemas are added that have the same target namespace, + the name passed to find will only be found if it occurs in the last +Add()ed. (e.g. if the target namespace is the empty string). + +Steps to reproduce the problem: +1. Compile test program +2. Run it with common.xsd, A.xsd & B.xsd in the same dir +3. + +Actual Results: +Displays: Bug: didn't find AType from A.xsd + + +Expected Results: +Should display: AType found. + +How often does this happen? +Every time + +Additional Information: +The problem is that XmlSchemas uses a hash table to make a map from target +namespace string keys to XmlSchemas. The implementation of Find first +looks to see if the namespace is present as a key and if so calls Find on +that XmlSchema. Only if the namespace isn't in the hash table does it +search all the XmlSchemas for the name. +Multiple XmlSchemas with the same target namespace causes the hashtable +entries to be repeatedly re-assigned, leaving only the last XmlSchemas +assigned to be found byt he check. + +There is some debate as to if this is the correct behaviour or not. +However, the when run on MS .NET with the test schemas provided if suceeds +in Finding the name. + +If the MS behaviour is to be matched, a simple change to XmlSchemas.Find +should be made so that if it fails to find the name in the schema that was +in the hashtable, it looks in all schemas (or make the hashtable values, +lists of XmlSchemas instead of single XmlSchemas) + +This difference in behaviour is responsible for different behaviour of the +Mono xsd tool vs the MS xsd tool when passes multiple XSD files and the +/classes switch. The MS tool generates a source object binding for every +type in every XSD (AType & BTyte in the examples below), whereas Mono xsd +only generates the types from the last XSD on the command like (BType, but +not AType). + + +Here is the test program XmlSchemasTest.cs: +using System; +using System.IO; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; + + +public class XmlSchemasTest +{ + public static void Main(string[] args) + { + XmlSchemas schemas = new XmlSchemas(); + + ValidationEventHandler validationEventHandler = new +ValidationEventHandler(ValidationCallbackOne); + + + + StreamReader sr = new StreamReader("A.xsd"); + XmlSchema xmls = XmlSchema.Read (sr, validationEventHandler); + schemas.Add(xmls); + sr.Close(); + + sr = new StreamReader("B.xsd"); + xmls = XmlSchema.Read (sr, validationEventHandler); + schemas.Add(xmls); + sr.Close(); + + XmlQualifiedName name = new XmlQualifiedName("AType"); + object elt = schemas.Find(name,typeof (XmlSchemaElement)); + + if (elt == null) + System.Console.WriteLine("Bug: didn't find AType from A.xsd"); + else + System.Console.WriteLine("AType found"); + } + + + public static void ValidationCallbackOne(object sender, +ValidationEventArgs args) { + Console.WriteLine(args.Message); + } + + +} + + + +--- +Here is A.xsd: +<?xml version="1.0" encoding="ISO-8859-1" ?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:include schemaLocation="common.xsd" /> + + <xs:element name="AType"> + <xs:complexType> + <xs:complexContent> + <xs:extension base="CType1"> + <xs:sequence> + <xs:element name="f1" type="xs:boolean" /> + <xs:element name="f2" type="SType1" /> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> +</xs:schema> + + +---- +Here is B.xsd: +<?xml version="1.0" encoding="ISO-8859-1" ?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:include schemaLocation="common.xsd" /> + + <xs:element name="BType"> + <xs:complexType> + <xs:complexContent> + <xs:extension base="CType1"> + <xs:sequence> + <xs:element name="bf1" type="xs:boolean" /> + <xs:element name="bf2" type="SType1" /> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> +</xs:schema> + + +--- +and here is common.xsd: +<?xml version="1.0" encoding="ISO-8859-1"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:complexType name="CType1"> + <xs:sequence> + <xs:element name="src" type="xs:string"/> + </xs:sequence> + </xs:complexType> + + + <xs:simpleType name="SType1"> + <xs:restriction base="xs:string"> + <xs:enumeration value="Value1"/> + <xs:enumeration value="Value2"/> + </xs:restriction> + </xs:simpleType> +</xs:schema> _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
