diff options
| -rw-r--r-- | ext/xmlreader/php_xmlreader.c | 46 | ||||
| -rwxr-xr-x | ext/xmlreader/tests/013.phpt | 52 | ||||
| -rwxr-xr-x | ext/xmlreader/tests/013.xsd | 10 |
3 files changed, 104 insertions, 4 deletions
diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index fb0c274eb3..793f03fab0 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -976,7 +976,7 @@ PHP_METHOD(xmlreader, setParserProperty) } /* }}} */ -/* {{{ proto boolean XMLReader::setRelaxNGSchemaSource(string filename) +/* {{{ proto boolean XMLReader::setRelaxNGSchema(string filename) Sets the string that the the XMLReader will parse. */ PHP_METHOD(xmlreader, setRelaxNGSchema) { @@ -992,10 +992,47 @@ PHP_METHOD(xmlreader, setRelaxNGSchemaSource) } /* }}} */ +/* {{{ proto boolean XMLReader::setSchema(string filename) +Use W3C XSD schema to validate the document as it is processed. Activation is only possible before the first Read(). */ +PHP_METHOD(xmlreader, setSchema) +{ +#ifdef LIBXML_SCHEMAS_ENABLED + zval *id; + int source_len = 0, retval = -1; + xmlreader_object *intern; + char *source; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s!", &source, &source_len) == FAILURE) { + return; + } + + if (source != NULL && !source_len) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Schema data source is required"); + RETURN_FALSE; + } + + id = getThis(); + + intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC); + if (intern && intern->ptr) { + retval = xmlTextReaderSchemaValidate(intern->ptr, source); + + if (retval == 0) { + RETURN_TRUE; + } + } + + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to set schema. This must be set prior to reading or schema contains errors."); + + RETURN_FALSE; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "No Schema support built into libxml."); + + RETURN_FALSE; +#endif +} + /* TODO -XMLPUBFUN int XMLCALL - xmlTextReaderSchemaValidate (xmlTextReaderPtr reader, - const char *xsd); XMLPUBFUN int XMLCALL xmlTextReaderSetSchema (xmlTextReaderPtr reader, xmlSchemaPtr schema); @@ -1137,6 +1174,7 @@ static zend_function_entry xmlreader_functions[] = { PHP_ME(xmlreader, setParserProperty, NULL, ZEND_ACC_PUBLIC) PHP_ME(xmlreader, setRelaxNGSchema, NULL, ZEND_ACC_PUBLIC) PHP_ME(xmlreader, setRelaxNGSchemaSource, NULL, ZEND_ACC_PUBLIC) + PHP_ME(xmlreader, setSchema, NULL, ZEND_ACC_PUBLIC) PHP_ME(xmlreader, XML, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC) PHP_ME(xmlreader, expand, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} diff --git a/ext/xmlreader/tests/013.phpt b/ext/xmlreader/tests/013.phpt new file mode 100755 index 0000000000..f9dcdeeec7 --- /dev/null +++ b/ext/xmlreader/tests/013.phpt @@ -0,0 +1,52 @@ +--TEST-- +XMLReader: Schema validation +--SKIPIF-- +<?php if (!extension_loaded('xmlreader')) die('skip');?> +<?php if (!method_exists('XMLReader','setSchema')) die('skip XMLReader::setSchema() not supported');?> +--FILE-- +<?php +/* $Id$ */ + +$xml =<<<EOF +<?xml version="1.0" encoding="UTF-8" ?> +<items> + <item>123</item> + <item>456</item> +</items> +EOF; + +$reader = new XMLReader(); +$reader->XML($xml); +$reader->setSchema(dirname(__FILE__) . '/013.xsd'); +while($reader->read()) { + if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'item') { + $reader->read(); + var_dump($reader->value); + } +} +$reader->close(); + +?> +===FAIL=== +<?php + +$xml =<<<EOF +<?xml version="1.0" encoding="UTF-8" ?> +<foo/> +EOF; + +$reader = new XMLReader(); +$reader->XML($xml); +$reader->setSchema(dirname(__FILE__) . '/013.xsd'); +while($reader->read() && $reader->nodeType != XMLReader::ELEMENT); +$reader->close(); + +?> +===DONE=== +--EXPECTF-- +string(3) "123" +string(3) "456" +===FAIL=== + +Warning: XMLReader::read(): Element 'foo': %s +===DONE=== diff --git a/ext/xmlreader/tests/013.xsd b/ext/xmlreader/tests/013.xsd new file mode 100755 index 0000000000..50b000b6fc --- /dev/null +++ b/ext/xmlreader/tests/013.xsd @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <xsd:element name="items"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="item" type="xsd:integer" minOccurs="0" maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> +</xsd:schema> |
