XsdValidatingReaderTests.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. //
  2. // MonoTests.System.Xml.XsdValidatingReaderTests.cs
  3. //
  4. // Author:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // (C)2003 Atsushi Enomoto
  8. // (C)2005-2007 Novell, Inc.
  9. //
  10. using System;
  11. using System.IO;
  12. using System.Net;
  13. using System.Xml;
  14. using System.Xml.Schema;
  15. using NUnit.Framework;
  16. using MonoTests.Helpers;
  17. namespace MonoTests.System.Xml
  18. {
  19. [TestFixture]
  20. public class XsdValidatingReaderTests
  21. {
  22. public XsdValidatingReaderTests ()
  23. {
  24. }
  25. XmlReader xtr;
  26. XmlValidatingReader xvr;
  27. private XmlValidatingReader PrepareXmlReader (string xml)
  28. {
  29. XmlReader reader = new XmlTextReader (xml, XmlNodeType.Document, null);
  30. // XmlDocument doc = new XmlDocument ();
  31. // doc.LoadXml (xml);
  32. // XmlReader reader = new XmlNodeReader (doc);
  33. return new XmlValidatingReader (reader);
  34. }
  35. [Test]
  36. public void TestEmptySchema ()
  37. {
  38. string xml = "<root/>";
  39. xvr = PrepareXmlReader (xml);
  40. xvr.ValidationType = ValidationType.Schema;
  41. xvr.Read (); // Is is missing schema component.
  42. }
  43. [Test]
  44. public void TestSimpleValidation ()
  45. {
  46. string xml = "<root/>";
  47. xvr = PrepareXmlReader (xml);
  48. Assert.AreEqual (ValidationType.Auto, xvr.ValidationType);
  49. XmlSchema schema = new XmlSchema ();
  50. XmlSchemaElement elem = new XmlSchemaElement ();
  51. elem.Name = "root";
  52. schema.Items.Add (elem);
  53. xvr.Schemas.Add (schema);
  54. xvr.Read (); // root
  55. Assert.AreEqual (ValidationType.Auto, xvr.ValidationType);
  56. xvr.Read (); // EOF
  57. xml = "<hoge/>";
  58. xvr = PrepareXmlReader (xml);
  59. xvr.Schemas.Add (schema);
  60. try {
  61. xvr.Read ();
  62. Assert.Fail ("element mismatch is incorrectly allowed");
  63. } catch (XmlSchemaException) {
  64. }
  65. xml = "<hoge xmlns='urn:foo' />";
  66. xvr = PrepareXmlReader (xml);
  67. xvr.Schemas.Add (schema);
  68. try {
  69. xvr.Read ();
  70. Assert.Fail ("Element in different namespace is incorrectly allowed.");
  71. } catch (XmlSchemaException) {
  72. }
  73. }
  74. [Test]
  75. public void TestReadTypedValueSimple ()
  76. {
  77. string xml = "<root>12</root>";
  78. XmlSchema schema = new XmlSchema ();
  79. XmlSchemaElement elem = new XmlSchemaElement ();
  80. elem.Name = "root";
  81. elem.SchemaTypeName = new XmlQualifiedName ("integer", XmlSchema.Namespace);
  82. schema.Items.Add (elem);
  83. // Lap 1:
  84. xvr = PrepareXmlReader (xml);
  85. xvr.Schemas.Add (schema);
  86. // Read directly from root.
  87. object o = xvr.ReadTypedValue ();
  88. Assert.AreEqual (ReadState.Initial, xvr.ReadState);
  89. Assert.IsNull (o);
  90. xvr.Read (); // element root
  91. Assert.AreEqual (XmlNodeType.Element, xvr.NodeType);
  92. Assert.IsNotNull (xvr.SchemaType);
  93. Assert.IsTrue (xvr.SchemaType is XmlSchemaDatatype);
  94. o = xvr.ReadTypedValue (); // read "12"
  95. Assert.AreEqual (XmlNodeType.EndElement, xvr.NodeType);
  96. Assert.IsNotNull (o);
  97. Assert.AreEqual (typeof (decimal), o.GetType ());
  98. decimal n = (decimal) o;
  99. Assert.AreEqual (12, n);
  100. Assert.IsTrue (!xvr.EOF);
  101. Assert.AreEqual ("root", xvr.Name);
  102. Assert.IsNull (xvr.SchemaType); // EndElement's type
  103. // Lap 2:
  104. xvr = PrepareXmlReader (xml);
  105. xvr.Schemas.Add (schema);
  106. xvr.Read (); // root
  107. XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype;
  108. Assert.IsNotNull (dt);
  109. Assert.AreEqual (typeof (decimal), dt.ValueType);
  110. Assert.AreEqual (XmlTokenizedType.None, dt.TokenizedType);
  111. xvr.Read (); // text "12"
  112. Assert.IsNull (xvr.SchemaType);
  113. o = xvr.ReadTypedValue ();
  114. // ReadTypedValue is different from ReadString().
  115. Assert.IsNull (o);
  116. }
  117. [Test]
  118. [Ignore ("XML Schema validator should not be available for validating non namespace-aware XmlReader that handled colon as a name character")]
  119. public void TestNamespacesFalse ()
  120. {
  121. // This tests if Namespaces=false is specified, then
  122. // the reader's NamespaceURI should be always string.Empty and
  123. // validation should be done against such schema that has target ns as "".
  124. string xml = "<x:root xmlns:x='urn:foo' />";
  125. xvr = PrepareXmlReader (xml);
  126. xvr.Namespaces = false;
  127. Assert.AreEqual (ValidationType.Auto, xvr.ValidationType);
  128. XmlSchema schema = new XmlSchema ();
  129. schema.TargetNamespace = "urn:foo";
  130. XmlSchemaElement elem = new XmlSchemaElement ();
  131. elem.Name = "root";
  132. schema.Items.Add (elem);
  133. xvr.Schemas.Add (schema);
  134. xvr.Read (); // root
  135. Assert.IsTrue (!xvr.Namespaces);
  136. Assert.AreEqual ("x:root", xvr.Name);
  137. // LocalName may contain colons.
  138. Assert.AreEqual ("x:root", xvr.LocalName);
  139. // NamespaceURI is not supplied.
  140. Assert.AreEqual ("", xvr.NamespaceURI);
  141. }
  142. [Test]
  143. public void TestReadTypedAttributeValue ()
  144. {
  145. string xml = "<root attr='12'></root>";
  146. XmlSchema schema = new XmlSchema ();
  147. XmlSchemaElement elem = new XmlSchemaElement ();
  148. elem.Name = "root";
  149. XmlSchemaComplexType ct = new XmlSchemaComplexType ();
  150. XmlSchemaAttribute attr = new XmlSchemaAttribute ();
  151. attr.Name = "attr";
  152. attr.SchemaTypeName = new XmlQualifiedName ("int", XmlSchema.Namespace);
  153. ct.Attributes.Add (attr);
  154. elem.SchemaType = ct;
  155. schema.Items.Add (elem);
  156. xvr = PrepareXmlReader (xml);
  157. xvr.Schemas.Add (schema);
  158. xvr.Read ();
  159. Assert.AreEqual ("root", xvr.Name);
  160. Assert.IsTrue (xvr.MoveToNextAttribute ()); // attr
  161. Assert.AreEqual ("attr", xvr.Name);
  162. XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype;
  163. Assert.IsNotNull (dt);
  164. Assert.AreEqual (typeof (int), dt.ValueType);
  165. Assert.AreEqual (XmlTokenizedType.None, dt.TokenizedType);
  166. object o = xvr.ReadTypedValue ();
  167. Assert.AreEqual (XmlNodeType.Attribute, xvr.NodeType);
  168. Assert.AreEqual (typeof (int), o.GetType ());
  169. int n = (int) o;
  170. Assert.AreEqual (12, n);
  171. Assert.IsTrue (xvr.ReadAttributeValue ()); // can read = seems not proceed.
  172. }
  173. [Test]
  174. public void DuplicateSchemaAssignment ()
  175. {
  176. string xml = @"<data
  177. xmlns='http://www.test.com/schemas/'
  178. xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  179. xsi:schemaLocation='http://www.test.com/schemas/ /home/user/schema.xsd' />";
  180. string xsd = @"<xs:schema
  181. targetNamespace='http://www.test.com/schemas/'
  182. xmlns:xs='http://www.w3.org/2001/XMLSchema'
  183. xmlns='http://www.test.com/schemas/' >
  184. <xs:element name='data' /></xs:schema>";
  185. string xmlns = "http://www.test.com/schemas/";
  186. XmlValidatingReader xvr = new XmlValidatingReader (
  187. xml, XmlNodeType.Document, null);
  188. XmlSchemaCollection schemas = new XmlSchemaCollection ();
  189. schemas.Add (XmlSchema.Read (new XmlTextReader (
  190. xsd, XmlNodeType.Document, null), null));
  191. xvr.Schemas.Add (schemas);
  192. while (!xvr.EOF)
  193. xvr.Read ();
  194. }
  195. [Test] // bug #76234
  196. public void DTDValidatorNamespaceHandling ()
  197. {
  198. string xml = "<xml xmlns='urn:a'> <foo> <a:bar xmlns='urn:b' xmlns:a='urn:a' /> <bug /> </foo> </xml>";
  199. XmlValidatingReader vr = new XmlValidatingReader (
  200. xml, XmlNodeType.Document, null);
  201. vr.Read ();
  202. vr.Read (); // whitespace
  203. Assert.AreEqual (String.Empty, vr.NamespaceURI, "#1");
  204. vr.Read (); // foo
  205. Assert.AreEqual ("urn:a", vr.NamespaceURI, "#2");
  206. vr.Read (); // whitespace
  207. vr.Read (); // a:bar
  208. Assert.AreEqual ("urn:a", vr.NamespaceURI, "#3");
  209. vr.Read (); // whitespace
  210. vr.Read (); // bug
  211. Assert.AreEqual ("urn:a", vr.NamespaceURI, "#4");
  212. }
  213. [Test]
  214. public void MultipleSchemaInSchemaLocation ()
  215. {
  216. XmlTextReader xtr = new XmlTextReader (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsd/multi-schemaLocation.xml"));
  217. XmlValidatingReader vr = new XmlValidatingReader (xtr);
  218. while (!vr.EOF)
  219. vr.Read ();
  220. }
  221. [Test]
  222. public void ReadTypedValueSimpleTypeRestriction ()
  223. {
  224. string xml = "<root>xx</root><!-- after -->";
  225. string xsd = @"
  226. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  227. <xs:element name='root'>
  228. <xs:simpleType>
  229. <xs:restriction base='xs:string'>
  230. <xs:minLength value='2' />
  231. </xs:restriction>
  232. </xs:simpleType>
  233. </xs:element>
  234. </xs:schema>";
  235. XmlTextReader xir =
  236. new XmlTextReader (xml, XmlNodeType.Document, null);
  237. XmlTextReader xsr =
  238. new XmlTextReader (xsd, XmlNodeType.Document, null);
  239. XmlValidatingReader vr = new XmlValidatingReader (xir);
  240. vr.Schemas.Add (XmlSchema.Read (xsr, null));
  241. vr.Read (); // root
  242. Assert.AreEqual ("xx", vr.ReadTypedValue ());
  243. Assert.AreEqual (XmlNodeType.EndElement, vr.NodeType);
  244. }
  245. // If we normalize string before validating with facets,
  246. // this test will fail. It will also fail if ReadTypedValue()
  247. // ignores whitespace nodes.
  248. [Test]
  249. public void ReadTypedValueWhitespaces ()
  250. {
  251. string xml = "<root> </root><!-- after -->";
  252. string xsd = @"
  253. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  254. <xs:element name='root'>
  255. <xs:simpleType>
  256. <xs:restriction base='xs:string'>
  257. <xs:minLength value='2' />
  258. </xs:restriction>
  259. </xs:simpleType>
  260. </xs:element>
  261. </xs:schema>";
  262. XmlTextReader xir =
  263. new XmlTextReader (xml, XmlNodeType.Document, null);
  264. XmlTextReader xsr =
  265. new XmlTextReader (xsd, XmlNodeType.Document, null);
  266. XmlValidatingReader vr = new XmlValidatingReader (xir);
  267. vr.Schemas.Add (XmlSchema.Read (xsr, null));
  268. vr.Read (); // root
  269. Assert.AreEqual (" ", vr.ReadTypedValue ());
  270. Assert.AreEqual (XmlNodeType.EndElement, vr.NodeType);
  271. }
  272. [Test] // bug #77241
  273. public void EmptyContentAllowWhitespace ()
  274. {
  275. string doc = @"
  276. <root>
  277. <!-- some comment -->
  278. <child/>
  279. </root>
  280. ";
  281. string schema = @"
  282. <xsd:schema xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
  283. <xsd:element name=""root"">
  284. <xsd:complexType>
  285. <xsd:sequence>
  286. <xsd:element name=""child"" type=""xsd:string"" />
  287. </xsd:sequence>
  288. </xsd:complexType>
  289. </xsd:element>
  290. </xsd:schema>
  291. ";
  292. XmlValidatingReader reader = new XmlValidatingReader (
  293. new XmlTextReader (new StringReader (doc)));
  294. reader.Schemas.Add (null,
  295. new XmlTextReader (new StringReader (schema)));
  296. while (reader.Read ())
  297. ;
  298. }
  299. [Test] // bug #79650
  300. // LAMESPEC: .NET does not throw XmlSchemaValidationException
  301. [ExpectedException (typeof (XmlSchemaException))]
  302. public void EnumerationFacetOnAttribute ()
  303. {
  304. string xml = "<test mode='NOT AN ENUMERATION VALUE' />";
  305. XmlSchema schema = XmlSchema.Read (new XmlTextReader (TestResourceHelper.GetFullPathOfResource ("Test/XmlFiles/xsd/79650.xsd")), null);
  306. XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
  307. xvr.ValidationType = ValidationType.Schema;
  308. xvr.Schemas.Add (schema);
  309. while (!xvr.EOF)
  310. xvr.Read ();
  311. }
  312. class XmlErrorResolver : XmlResolver
  313. {
  314. public override ICredentials Credentials {
  315. set { }
  316. }
  317. public override object GetEntity (Uri uri, string role, Type type)
  318. {
  319. throw new Exception ();
  320. }
  321. }
  322. [Test] // bug #79924
  323. public void ValidationTypeNoneIgnoreSchemaLocations ()
  324. {
  325. string xml = "<project xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='nosuchschema.xsd'/>";
  326. XmlValidatingReader vr = new XmlValidatingReader (
  327. new XmlTextReader (new StringReader (xml)));
  328. vr.ValidationType = ValidationType.None;
  329. vr.XmlResolver = new XmlErrorResolver ();
  330. while (!vr.EOF)
  331. vr.Read ();
  332. }
  333. [Test] // bug #336625
  334. public void ValidationTypeNoneIgnoreLocatedSchemaErrors ()
  335. {
  336. string xml = "<test xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='Test/XmlFiles/xsd/336625.xsd'/>";
  337. XmlValidatingReader vr = new XmlValidatingReader (
  338. new XmlTextReader (new StringReader (xml)));
  339. vr.ValidationType = ValidationType.None;
  340. while (!vr.EOF)
  341. vr.Read ();
  342. }
  343. [Test]
  344. public void Bug81360 ()
  345. {
  346. string schemaResource = "Test/XmlFiles/xsd/81360.xsd";
  347. XmlTextReader treader = new XmlTextReader (TestResourceHelper.GetFullPathOfResource (schemaResource));
  348. XmlSchema sc = XmlSchema.Read (treader, null);
  349. sc.Compile (null);
  350. string xml = @"<body xmlns='" + sc.TargetNamespace + "'><div></div></body>";
  351. XmlTextReader reader = new XmlTextReader (new StringReader (xml));
  352. XmlValidatingReader validator = new XmlValidatingReader (reader);
  353. validator.Schemas.Add (sc);
  354. validator.ValidationType = ValidationType.Schema;
  355. while (!validator.EOF)
  356. validator.Read ();
  357. }
  358. [Test]
  359. public void Bug81460 ()
  360. {
  361. string xsd = "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'><xs:element name='foo'><xs:complexType><xs:attribute name='a' default='x' /></xs:complexType></xs:element></xs:schema>";
  362. string xml = "<foo/>";
  363. XmlReaderSettings s = new XmlReaderSettings ();
  364. s.ValidationType = ValidationType.Schema;
  365. s.Schemas.Add (XmlSchema.Read (new StringReader (xsd), null));
  366. XmlReader r = XmlReader.Create (new StringReader (xml), s);
  367. r.Read ();
  368. r.MoveToFirstAttribute (); // default attribute
  369. Assert.AreEqual (String.Empty, r.Prefix);
  370. }
  371. [Test]
  372. // annoyance
  373. [ExpectedException (typeof (XmlSchemaValidationException))]
  374. public void Bug82099 ()
  375. {
  376. string xsd = @"
  377. <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
  378. <xsd:element name='Customer' type='CustomerType' />
  379. <xsd:complexType name='CustomerType'>
  380. <xsd:attribute name='name' type='xsd:string' />
  381. </xsd:complexType>
  382. </xsd:schema>";
  383. XmlSchema schema = XmlSchema.Read (new StringReader (xsd), null);
  384. string xml = "<Customer name='Bob'> </Customer>";
  385. XmlReaderSettings settings = new XmlReaderSettings ();
  386. settings.Schemas.Add (schema);
  387. settings.ValidationType = ValidationType.Schema;
  388. XmlReader reader = XmlReader.Create (new StringReader (xml), settings);
  389. reader.Read ();
  390. reader.Read ();
  391. reader.Read ();
  392. }
  393. [Test]
  394. public void Bug82010 ()
  395. {
  396. string xmlresource = "Test/XmlFiles/xsd/82010.xml";
  397. string xsdresource = "Test/XmlFiles/xsd/82010.xsd";
  398. XmlTextReader xr = null, xr2 = null;
  399. try {
  400. xr = new XmlTextReader (TestResourceHelper.GetFullPathOfResource (xsdresource));
  401. xr2 = new XmlTextReader (TestResourceHelper.GetFullPathOfResource (xmlresource));
  402. XmlValidatingReader xvr = new XmlValidatingReader (xr2);
  403. xvr.Schemas.Add (XmlSchema.Read (xr, null));
  404. while (!xvr.EOF)
  405. xvr.Read ();
  406. } finally {
  407. if (xr2 != null)
  408. xr2.Close ();
  409. if (xr != null)
  410. xr.Close ();
  411. }
  412. }
  413. [Test]
  414. public void Bug376395 ()
  415. {
  416. string xmlresource = "Test/XmlFiles/xsd/376395.xml";
  417. string xsdresource = "Test/XmlFiles/xsd/376395.xsd";
  418. XmlTextReader xr = null, xr2 = null;
  419. try {
  420. xr = new XmlTextReader (TestResourceHelper.GetFullPathOfResource (xsdresource));
  421. xr2 = new XmlTextReader (TestResourceHelper.GetFullPathOfResource (xmlresource));
  422. XmlValidatingReader xvr = new XmlValidatingReader (xr2);
  423. xvr.Schemas.Add (XmlSchema.Read (xr, null));
  424. while (!xvr.EOF)
  425. xvr.Read ();
  426. } finally {
  427. if (xr2 != null)
  428. xr2.Close ();
  429. if (xr != null)
  430. xr.Close ();
  431. }
  432. }
  433. [Test]
  434. public void ValidateMixedInsideXsdAny ()
  435. {
  436. string xml = @"<root xmlns='urn:foo'>
  437. <X><Z>text</Z></X>
  438. <Y><X><Z>text</Z></X></Y>
  439. </root>";
  440. string xsd = @"
  441. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
  442. targetNamespace='urn:foo' xmlns='urn:foo'>
  443. <xs:complexType name='root-type'>
  444. <xs:sequence><xs:element ref='X' /><xs:element ref='Y' /></xs:sequence>
  445. </xs:complexType>
  446. <xs:complexType name='X-type'>
  447. <xs:choice minOccurs='1' maxOccurs='unbounded'>
  448. <xs:any processContents='skip'/>
  449. </xs:choice>
  450. </xs:complexType>
  451. <xs:complexType name='Y-type'>
  452. <xs:sequence><xs:element ref='X' /></xs:sequence>
  453. </xs:complexType>
  454. <xs:element name='root' type='root-type' />
  455. <xs:element name='X' type='X-type' />
  456. <xs:element name='Y' type='Y-type' />
  457. </xs:schema>";
  458. XmlTextReader xtr = new XmlTextReader (new StringReader (xml));
  459. XmlValidatingReader xvr = new XmlValidatingReader (xtr);
  460. XmlReader xsr = new XmlTextReader (new StringReader (xsd));
  461. xvr.Schemas.Add (XmlSchema.Read (xsr, null));
  462. while (!xvr.EOF)
  463. xvr.Read ();
  464. xtr = new XmlTextReader (new StringReader (xml));
  465. xsr = new XmlTextReader (new StringReader (xsd));
  466. var s = new XmlReaderSettings ();
  467. s.Schemas.Add (XmlSchema.Read (xsr, null));
  468. s.ValidationType = ValidationType.Schema;
  469. XmlReader xvr2 = XmlReader.Create (xtr, s);
  470. while (!xvr2.EOF)
  471. xvr2.Read ();
  472. }
  473. [Test]
  474. public void WhitespaceAndElementOnly ()
  475. {
  476. string xsd = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  477. <xs:element name='element_list'>
  478. <xs:complexType>
  479. <xs:sequence>
  480. <xs:element name='element' maxOccurs='unbounded' />
  481. </xs:sequence>
  482. </xs:complexType>
  483. </xs:element>
  484. </xs:schema>";
  485. string xml = @"<element_list>
  486. <!-- blah blah blah -->
  487. <element />
  488. <!-- blah blah -->
  489. <element />
  490. </element_list>";
  491. RunValidation (xml, xsd);
  492. }
  493. [Test]
  494. [ExpectedException (typeof (XmlSchemaValidationException))]
  495. public void EnumerationFacet ()
  496. {
  497. // bug #339934
  498. string xsd = @"<xs:schema id='schema' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  499. <xs:simpleType name='ModeType'>
  500. <xs:restriction base='xs:string'>
  501. <xs:enumeration value='on' />
  502. <xs:enumeration value='off' />
  503. </xs:restriction>
  504. </xs:simpleType>
  505. <xs:element name='test'>
  506. <xs:complexType>
  507. <xs:sequence/>
  508. <xs:attribute name='mode' type='ModeType' use='required' />
  509. </xs:complexType>
  510. </xs:element>
  511. </xs:schema>";
  512. string xml = @"<test mode='out of scope'></test>";
  513. RunValidation (xml, xsd);
  514. }
  515. [Test]
  516. public void Bug501763 ()
  517. {
  518. string xsd1 = @"
  519. <xs:schema id='foo1'
  520. targetNamespace='foo1'
  521. elementFormDefault='qualified'
  522. xmlns='foo1'
  523. xmlns:xs='http://www.w3.org/2001/XMLSchema'
  524. xmlns:f2='foo2'>
  525. <xs:import namespace='foo2' />
  526. <xs:element name='Foo1Element' type='f2:Foo2ExtendedType'/>
  527. </xs:schema>";
  528. string xsd2 = @"
  529. <xs:schema id='foo2'
  530. targetNamespace='foo2'
  531. elementFormDefault='qualified'
  532. xmlns='foo2'
  533. xmlns:xs='http://www.w3.org/2001/XMLSchema' >
  534. <xs:element name='Foo2Element' type='Foo2Type' />
  535. <xs:complexType name='Foo2Type'>
  536. <xs:attribute name='foo2Attr' type='xs:string' use='required'/>
  537. </xs:complexType>
  538. <xs:complexType name='Foo2ExtendedType'>
  539. <xs:complexContent>
  540. <xs:extension base='Foo2Type'>
  541. <xs:attribute name='foo2ExtAttr' type='xs:string' use='required'/>
  542. </xs:extension>
  543. </xs:complexContent>
  544. </xs:complexType>
  545. </xs:schema>";
  546. XmlDocument doc = new XmlDocument ();
  547. XmlSchema schema1 = XmlSchema.Read (XmlReader.Create (new StringReader (xsd1)), null);
  548. XmlSchema schema2 = XmlSchema.Read (XmlReader.Create (new StringReader (xsd2)), null);
  549. doc.LoadXml (@"
  550. <Foo2Element
  551. foo2Attr='dummyvalue1'
  552. xmlns='foo2'
  553. />");
  554. doc.Schemas.Add (schema2);
  555. doc.Validate (null);
  556. doc = new XmlDocument();
  557. doc.LoadXml(@"
  558. <Foo1Element
  559. foo2Attr='dummyvalue1'
  560. foo2ExtAttr='dummyvalue2'
  561. xmlns='foo1'
  562. />");
  563. doc.Schemas.Add (schema2);
  564. doc.Schemas.Add (schema1);
  565. doc.Validate (null);
  566. }
  567. void RunValidation (string xml, string xsd)
  568. {
  569. XmlReaderSettings s = new XmlReaderSettings ();
  570. s.ValidationType = ValidationType.Schema;
  571. s.Schemas.Add (XmlSchema.Read (XmlReader.Create (new StringReader (xsd)), null));
  572. XmlReader r = XmlReader.Create (new StringReader (xml), s);
  573. while (!r.EOF)
  574. r.Read ();
  575. }
  576. }
  577. }