Fix bug #13716 - use XmlSchemaSettings.XmlResolver to resolve schemas.
authorAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Thu, 8 Aug 2013 12:38:47 +0000 (21:38 +0900)
committerAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Thu, 8 Aug 2013 12:38:47 +0000 (21:38 +0900)
mcs/class/System.XML/System.Xml.Schema/XmlSchemaSet.cs
mcs/class/System.XML/Test/System.Xml.Schema/XmlSchemaSetTests.cs

index 11ad6b3a4a21834566a5dd414240210688a61394..bad7071427b43af07c86377c3d9ca6d9cb30e076 100644 (file)
@@ -130,14 +130,10 @@ namespace System.Xml.Schema
 
                public XmlSchema Add (string targetNamespace, string schemaUri)
                {
-                       XmlTextReader r = null;
-                       try {
-                               r = new XmlTextReader (schemaUri, nameTable);
-                               return Add (targetNamespace, r);
-                       } finally {
-                               if (r != null)
-                                       r.Close ();
-                       }
+                       var uri = xmlResolver.ResolveUri (null, schemaUri);
+                       using (var stream = (Stream) xmlResolver.GetEntity (uri, null, typeof (Stream)))
+                               using (var r = XmlReader.Create (stream, new XmlReaderSettings () { XmlResolver = xmlResolver, NameTable = nameTable}))
+                                       return Add (targetNamespace, r);
                }
 
                public XmlSchema Add (string targetNamespace, XmlReader schemaDocument)
index 6a8a7a49d8accf2b444cc3efc26ae861e332e194..127a21aea4eb04c899518fb5958e4c1df2825b25 100644 (file)
@@ -11,6 +11,7 @@
 using System;
 using System.Collections;
 using System.IO;
+using System.Text;
 using System.Xml;
 using System.Xml.Schema;
 using NUnit.Framework;
@@ -279,6 +280,40 @@ type=""xsd:string"" use=""required""/>
                        xss.Compile ();
                        Assert.IsNotNull (xss.GlobalElements [new XmlQualifiedName ("GetSystemDateAndTimeResponse", "http://www.onvif.org/ver10/device/wsdl")], "#1");
                }
+               
+               [Test] // bug #13716
+               public void ResolveSchemaUriUsingXmlResolver ()
+               {
+                       var resolver = new Bug13716XmlResolver ();
+                       string xml = "<people xmlns='testschema'><person name='Ian'><books><book>Clean Code</book></books></person></people>";
+                       string ns = "testschema";
+                       string xsdPath = "my.xsd";
+
+                       var readerSettings = new XmlReaderSettings ();
+
+                       //readerSettings.XmlResolver = resolver;
+                       readerSettings.Schemas.XmlResolver = resolver;
+                       readerSettings.Schemas.Add (ns, xsdPath);
+                       readerSettings.ValidationType = ValidationType.Schema;
+
+                       using (var xr = XmlReader.Create (new StringReader (xml), readerSettings))
+                       {
+                               while (!xr.EOF)
+                                       xr.Read ();
+                       }
+               }
+               
+               public class Bug13716XmlResolver : XmlUrlResolver
+               {
+                       public override object GetEntity(Uri absoluteUri, string role, Type typeOfObjectToReturn)
+                       {
+                               string xsd = @"
+               <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='testschema'>
+                 <xs:element name='people' />
+               </xs:schema>";
+                               return new MemoryStream (Encoding.UTF8.GetBytes (xsd));
+                       }
+               }
        }
 }
 #endif