[Mono-bugs] [Bug 496192] New: XmlSchema error: The instance type was not found while reading a XML file
bugzilla_noreply at novell.com
bugzilla_noreply at novell.com
Fri Apr 17 17:07:07 EDT 2009
http://bugzilla.novell.com/show_bug.cgi?id=496192
Summary: XmlSchema error: The instance type was not found while
reading a XML file
Classification: Mono
Product: Mono: Class Libraries
Version: unspecified
Platform: i686
OS/Version: All
Status: NEW
Severity: Normal
Priority: P5 - None
Component: Sys.XML
AssignedTo: atsushi at ximian.com
ReportedBy: stu_dan at hispeed.cH
QAContact: mono-bugs at lists.ximian.com
Found By: ---
Created an attachment (id=286601)
--> (http://bugzilla.novell.com/attachment.cgi?id=286601)
The demo project
User-Agent: Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.8)
Gecko/2009032711 Ubuntu/8.10 (intrepid) Firefox/3.0.8
Hi
The attached project works fine under Microsoft .NET but fails under Mono with
the following error information:
Unhandled Exception: System.Xml.Schema.XmlSchemaValidationException: XmlSchema
error: The instance type was not found: HotelAddress XML Line 5, Position 6.
After several hours of trial and error and some debugging I found a workaround.
More about the workaround later in this message.
I'm not sure but the problematic lines of code can be found in the method
XmlQualifiedName.Parse, which is called from the XmlSchemaValidator method
GetXsiType. First I thought it's the lookup of the type done in the method
FindType, cause in my demo program the GlobalTypes table had no entry. But this
was fixed after compiling the the Schemas with:
settings.Schemas.Compile()
and in fact it is not necessary to compile the schemas.
A closer look at the XmlQualifiedName.Parse method made me curious. There is a
namespace lookup for prefixed types, but if there is no prefix, as in my demo
project, the index is < 0 and the qualified name with an empty namespaces is
returned (line: return new XMlQualifiedName (name)).
In my opinion a qualified name always needs a namespace (otherwise it's not a
qualified one) and so I suggest to have the following line:
return new XmlQualifiedName (name, resolver.LookupNamespace(""));
-- Workaround --
Cause there is a lookup for the namespace by the prefix in XmlQualfiedName, you
just have to prefix the elements and xsi-types in the XML file. i.e.
<?xml version="1.0" encoding="utf-8" ?>
<tns:Person xmlns:tns="http://tempuri.org/Person.xsd" Firstname="Daniel"
Lastname="Stutz">
<tns:Addresses/>
</tns:Person>
To write such an XML file you need to specifiy the namespace for the
serializer. i.e.
serializer.Serialize(Console.Out, person, new XmlSerializerNamespaces(new
XmlQualifiedName[] { new XmlQualifiedName("tns",
"http://tempuri.org/Person.xsd"), new XmlQualifiedName("xsi",
"http://www.w3.org/2001/XMLSchema-instance") }));
--
-- XmlSchemaValidator.cs --
private XmlSchemaType FindType (XmlQualifiedName qname)
{
return (XmlSchemaType) schemas.GlobalTypes [qname];
}
private object GetXsiType (string name)
{
object xsiType = null;
XmlQualifiedName typeQName =
XmlQualifiedName.Parse (name, nsResolver);
if (typeQName == ComplexType.AnyTypeName)
xsiType = ComplexType.AnyType;
else if (XmlSchemaUtil.IsBuiltInDatatypeName (typeQName))
xsiType = XsDatatype.FromName (typeQName);
else
xsiType = FindType (typeQName);
return xsiType;
}
--
-- XmlQualifiedName.cs --
internal static XmlQualifiedName Parse (string name, IXmlNamespaceResolver
resolver)
{
int index = name.IndexOf (':');
if (index < 0)
return new XmlQualifiedName (name);
string ns = resolver.LookupNamespace (name.Substring (0, index));
if (ns == null)
throw new ArgumentException ("Invalid qualified name.");
return new XmlQualifiedName (name.Substring (index + 1), ns);
}
--
-- Full error information --
Unhandled Exception: System.Xml.Schema.XmlSchemaValidationException: XmlSchema
error: The instance type was not found: HotelAddress XML Line 5, Position 6.
at System.Xml.XmlReaderSettings.OnValidationError (System.Object o,
System.Xml.Schema.ValidationEventArgs e) [0x00000]
at
Mono.Xml.Schema.XmlSchemaValidatingReader+<XmlSchemaValidatingReader>c__AnonStorey2.<>m__1
(System.Object o, System.Xml.Schema.ValidationEventArgs e) [0x00000]
at System.Xml.Schema.XmlSchemaValidator.HandleError
(System.Xml.Schema.XmlSchemaValidationException exception, Boolean isWarning)
[0x00000]
at System.Xml.Schema.XmlSchemaValidator.HandleError (System.String message,
System.Exception innerException, Boolean isWarning) [0x00000]
at System.Xml.Schema.XmlSchemaValidator.HandleError (System.String message)
[0x00000]
at System.Xml.Schema.XmlSchemaValidator.HandleXsiType (System.String
typename) [0x00000]
at System.Xml.Schema.XmlSchemaValidator.ValidateElement (System.String
localName, System.String ns, System.Xml.Schema.XmlSchemaInfo info,
System.String xsiType, System.String xsiNil, System.String schemaLocation,
System.String noNsSchemaLocation) [0x00000]
at Mono.Xml.Schema.XmlSchemaValidatingReader.Read () [0x00000]
at System.Xml.XmlReader.MoveToContent () [0x00000]
at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadListElement
(System.Xml.Serialization.XmlTypeMapping typeMap, Boolean isNullable,
System.Object list, Boolean canCreateInstance) [0x00000]
at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadMembers
(System.Xml.Serialization.ClassMap map, System.Object ob, Boolean isValueList,
Boolean readByOrder) [0x00000]
at
System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadClassInstanceMembers
(System.Xml.Serialization.XmlTypeMapping typeMap, System.Object ob) [0x00000]
at
System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadClassInstance
(System.Xml.Serialization.XmlTypeMapping typeMap, Boolean isNullable, Boolean
checkType) [0x00000]
at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadObject
(System.Xml.Serialization.XmlTypeMapping typeMap, Boolean isNullable, Boolean
checkType) [0x00000]
at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot
(System.Xml.Serialization.XmlTypeMapping rootMap) [0x00000]
at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot ()
[0x00000]
at System.Xml.Serialization.XmlSerializer.Deserialize
(System.Xml.Serialization.XmlSerializationReader reader) [0x00000]
--
Reproducible: Always
Steps to Reproduce:
1. Compile and run
2.
3.
Actual Results:
Works under Microsoft .NET
Fails under Mono
Expected Results:
Works under Microsoft .NET
Works under Mono
--
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
More information about the mono-bugs
mailing list