def test_multiple_elementrees(self): tree = self.parse('<a><b>B</b><c>C</c></a>') schema = etree.RelaxNG( self.parse('''\ <element name="a" xmlns="http://relaxng.org/ns/structure/1.0"> <element name="b"> <text /> </element> <element name="c"> <text /> </element> </element> ''') ) self.assert_(schema.validate(tree)) self.assert_(schema.validate(tree)) schema = etree.RelaxNG( self.parse('''\ <element name="b" xmlns="http://relaxng.org/ns/structure/1.0"> <text /> </element> ''') ) c_tree = etree.ElementTree(tree.getroot()[1]) self.assertEqual(self._rootstring(c_tree), _bytes('<c>C</c>')) self.assert_(not schema.validate(c_tree)) b_tree = etree.ElementTree(tree.getroot()[0]) self.assertEqual(self._rootstring(b_tree), _bytes('<b>B</b>')) self.assert_(schema.validate(b_tree))
def test_relaxng_compact_file_obj(self): with open(fileInTestDir('test.rnc'), 'r') as f: schema = etree.RelaxNG(file=f) tree_valid = self.parse('<a><b>B</b><c>C</c></a>') tree_invalid = self.parse('<a><b></b></a>') self.assertTrue(schema.validate(tree_valid)) self.assertFalse(schema.validate(tree_invalid))
def test_relaxng_include(self): # this will only work if we access the file through path or # file object.. f = open(fileInTestDir('test1.rng'), 'rb') try: schema = etree.RelaxNG(file=f) finally: f.close()
def test_schematron_relaxng_embedded(self): schema = self.parse('''\ <grammar xmlns="http://relaxng.org/ns/structure/1.0" xmlns:sch="http://purl.oclc.org/dsdl/schematron" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> <start> <ref name="message"/> </start> <define name="message"> <element name="message"> <element name="number_of_entries"> <!-- RelaxNG can be mixed freely with stuff from other namespaces --> <sch:pattern id="number_of_entries"> <sch:title>mandatory number_of_entries tests</sch:title> <sch:rule context="number_of_entries"> <sch:assert test="text()=count(../entries/entry)">[ERROR] number_of_entries (<sch:value-of select="."/>) must equal the number of entries/entry elements (<sch:value-of select="count(../entries/entry)"/>)</sch:assert> </sch:rule> </sch:pattern> <data type="positiveInteger"/> </element> <element name="entries"> <zeroOrMore> <element name="entry"><data type="string"/></element> </zeroOrMore> </element> </element> </define> </grammar> ''') tree_valid = self.parse('''\ <message> <number_of_entries>2</number_of_entries> <entries> <entry>Entry 1</entry> <entry>Entry 2</entry> </entries> </message> ''') tree_invalid = self.parse('''\ <message> <number_of_entries>1</number_of_entries> <entries> <entry>Entry 1</entry> <entry>Entry 2</entry> </entries> </message> ''') relaxng = etree.RelaxNG(schema) schematron = isoschematron.Schematron(schema) # fwiw, this must also be RelaxNG-valid self.assertTrue(relaxng(tree_valid), relaxng.error_log) self.assertTrue(schematron(tree_valid)) # still schema-valid self.assertTrue(relaxng(tree_invalid), relaxng.error_log) self.assertTrue(not schematron(tree_invalid))
def test_relaxng_stringio(self): tree_valid = self.parse('<a><b></b></a>') tree_invalid = self.parse('<a><c></c></a>') schema_file = BytesIO('''\ <element name="a" xmlns="http://relaxng.org/ns/structure/1.0"> <zeroOrMore> <element name="b"> <text /> </element> </zeroOrMore> </element> ''') schema = etree.RelaxNG(file=schema_file) self.assert_(schema.validate(tree_valid)) self.assert_(not schema.validate(tree_invalid))
def test_relaxng_error(self): tree_invalid = self.parse('<a><c></c></a>') schema = self.parse('''\ <element name="a" xmlns="http://relaxng.org/ns/structure/1.0"> <zeroOrMore> <element name="b"> <text /> </element> </zeroOrMore> </element> ''') schema = etree.RelaxNG(schema) self.assertFalse(schema.validate(tree_invalid)) errors = schema.error_log self.assertTrue([log for log in errors if log.level_name == "ERROR"]) self.assertTrue([log for log in errors if "not expect" in log.message])
def test_relaxng_generic_error(self): tree_invalid = self.parse('''\ <test> <reference id="my-ref">This is my unique ref.</reference> <data ref="my-ref">Valid data</data> <data ref="myref">Invalid data</data> </test> ''') schema = self.parse('''\ <grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" xmlns="http://relaxng.org/ns/structure/1.0"> <define name="by-ref"> <data type="IDREF"/> </define> <start> <element name="test"> <zeroOrMore> <element name="reference"> <attribute name="id"> <data type="ID"/> </attribute> <text/> </element> </zeroOrMore> <zeroOrMore> <element name="data"> <attribute name="ref"> <data type="IDREF"/> </attribute> <text/> </element> </zeroOrMore> </element> </start> </grammar> ''') schema = etree.RelaxNG(schema) self.assertFalse(schema.validate(tree_invalid)) errors = schema.error_log self.assertTrue(errors) self.assertTrue([log for log in errors if "IDREF" in log.message]) self.assertTrue([log for log in errors if "myref" in log.message])
def test_relaxng(self): tree_valid = self.parse('<a><b></b></a>') tree_invalid = self.parse('<a><c></c></a>') schema = self.parse('''\ <element name="a" xmlns="http://relaxng.org/ns/structure/1.0"> <zeroOrMore> <element name="b"> <text /> </element> </zeroOrMore> </element> ''') schema = etree.RelaxNG(schema) self.assertTrue(schema.validate(tree_valid)) self.assertFalse(schema.error_log.filter_from_errors()) self.assertFalse(schema.validate(tree_invalid)) self.assertTrue(schema.error_log.filter_from_errors()) self.assertTrue(schema.validate(tree_valid)) # repeat valid self.assertFalse(schema.error_log.filter_from_errors()) # repeat valid
def test_relaxng_compact_file_obj(self): f = open(fileInTestDir('test.rnc'), 'rb') try: schema = etree.RelaxNG(file=f) finally: f.close()
def test_relaxng_compact(self): tree_valid = self.parse('<a><b>B</b><c>C</c></a>') tree_invalid = self.parse('<a><b></b></a>') schema = etree.RelaxNG(file=fileInTestDir('test.rnc')) self.assertTrue(schema.validate(tree_valid)) self.assertFalse(schema.validate(tree_invalid))