summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/xmlreader/php_xmlreader.c46
-rwxr-xr-xext/xmlreader/tests/013.phpt52
-rwxr-xr-xext/xmlreader/tests/013.xsd10
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>