]> granicus.if.org Git - php/commitdiff
Add schema default/fixed value support
authorChris Wright <chrisw@networkm.co.uk>
Thu, 11 Apr 2013 16:39:28 +0000 (17:39 +0100)
committerChris Wright <chrisw@networkm.co.uk>
Fri, 12 Apr 2013 08:50:14 +0000 (09:50 +0100)
Added support for adding fixed/default values during XSD validation
and added/updated associated tests

ext/dom/document.c
ext/dom/tests/DOMDocument_schemaValidateSource_addAttrs.phpt [new file with mode: 0644]
ext/dom/tests/DOMDocument_schemaValidateSource_error4.phpt
ext/dom/tests/DOMDocument_schemaValidateSource_missingAttrs.phpt [new file with mode: 0644]
ext/dom/tests/DOMDocument_schemaValidate_addAttrs.phpt [new file with mode: 0644]
ext/dom/tests/DOMDocument_schemaValidate_error4.phpt
ext/dom/tests/DOMDocument_schemaValidate_error5.phpt
ext/dom/tests/DOMDocument_schemaValidate_missingAttrs.phpt [new file with mode: 0644]
ext/dom/tests/book-attr.xml [new file with mode: 0644]
ext/dom/tests/book.xsd
ext/libxml/libxml.c

index d17c7cbd55f1daed0b9c3302898f206574121e44..efe6d9070fb7cd515001c14ce93906ac297b514a 100644 (file)
@@ -1973,14 +1973,15 @@ static void _dom_document_schema_validate(INTERNAL_FUNCTION_PARAMETERS, int type
        xmlDoc *docp;
        dom_object *intern;
        char *source = NULL, *valid_file = NULL;
-       int source_len = 0;
+       int source_len = 0, valid_opts = 0;
+       long flags = 0;
        xmlSchemaParserCtxtPtr  parser;
        xmlSchemaPtr            sptr;
        xmlSchemaValidCtxtPtr   vptr;
        int                     is_valid;
        char resolved_path[MAXPATHLEN + 1];
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Op", &id, dom_document_class_entry, &source, &source_len) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Op|l", &id, dom_document_class_entry, &source, &source_len, &flags) == FAILURE) {
                return;
        }
 
@@ -2029,6 +2030,13 @@ static void _dom_document_schema_validate(INTERNAL_FUNCTION_PARAMETERS, int type
                RETURN_FALSE;
        }
 
+#if LIBXML_VERSION >= 20614
+       if (flags & XML_SCHEMA_VAL_VC_I_CREATE) {
+               valid_opts |= XML_SCHEMA_VAL_VC_I_CREATE;
+       }
+#endif
+
+       xmlSchemaSetValidOptions(vptr, valid_opts);
        xmlSchemaSetValidErrors(vptr, php_libxml_error_handler, php_libxml_error_handler, vptr);
        is_valid = xmlSchemaValidateDoc(vptr, docp);
        xmlSchemaFree(sptr);
@@ -2042,14 +2050,14 @@ static void _dom_document_schema_validate(INTERNAL_FUNCTION_PARAMETERS, int type
 }
 /* }}} */
 
-/* {{{ proto boolean dom_document_schema_validate_file(string filename); */
+/* {{{ proto boolean dom_document_schema_validate_file(string filename, int flags); */
 PHP_FUNCTION(dom_document_schema_validate_file)
 {
        _dom_document_schema_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE);
 }
 /* }}} end dom_document_schema_validate_file */
 
-/* {{{ proto boolean dom_document_schema_validate(string source); */
+/* {{{ proto boolean dom_document_schema_validate(string source, int flags); */
 PHP_FUNCTION(dom_document_schema_validate_xml)
 {
        _dom_document_schema_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING);
diff --git a/ext/dom/tests/DOMDocument_schemaValidateSource_addAttrs.phpt b/ext/dom/tests/DOMDocument_schemaValidateSource_addAttrs.phpt
new file mode 100644 (file)
index 0000000..994b94d
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+DomDocument::schemaValidateSource() - Add missing attribute default values from schema
+--CREDITS--
+Chris Wright <info@daverandom.com>
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+$doc = new DOMDocument;
+
+$doc->load(dirname(__FILE__)."/book-attr.xml");
+
+$xsd = file_get_contents(dirname(__FILE__)."/book.xsd");
+
+$doc->schemaValidateSource($xsd, LIBXML_SCHEMA_CREATE);
+
+foreach ($doc->getElementsByTagName('book') as $book) {
+    var_dump($book->getAttribute('is-hardback'));
+}
+
+?>
+--EXPECT--
+string(5) "false"
+string(4) "true"
index 65c8d8678f8ea87f4a67e2033700881ddc77fd97..f841b874288dd7f116ff5db0ebc63c70c7064640 100644 (file)
@@ -17,5 +17,5 @@ var_dump($result);
 
 ?>
 --EXPECTF--
-Warning: DOMDocument::schemaValidateSource() expects exactly 1 parameter, 0 given in %s.php on line %d
+Warning: DOMDocument::schemaValidateSource() expects at least 1 parameter, 0 given in %s.php on line %d
 NULL
diff --git a/ext/dom/tests/DOMDocument_schemaValidateSource_missingAttrs.phpt b/ext/dom/tests/DOMDocument_schemaValidateSource_missingAttrs.phpt
new file mode 100644 (file)
index 0000000..7c98a74
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+DomDocument::schemaValidateSource() - Don't add missing attribute default values from schema
+--CREDITS--
+Chris Wright <info@daverandom.com>
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+$doc = new DOMDocument;
+
+$doc->load(dirname(__FILE__)."/book-attr.xml");
+
+$xsd = file_get_contents(dirname(__FILE__)."/book.xsd");
+
+$doc->schemaValidateSource($xsd);
+
+foreach ($doc->getElementsByTagName('book') as $book) {
+    var_dump($book->getAttribute('is-hardback'));
+}
+
+?>
+--EXPECT--
+string(0) ""
+string(4) "true"
diff --git a/ext/dom/tests/DOMDocument_schemaValidate_addAttrs.phpt b/ext/dom/tests/DOMDocument_schemaValidate_addAttrs.phpt
new file mode 100644 (file)
index 0000000..e0b5251
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+DomDocument::schemaValidate() - Add missing attribute default values from schema
+--CREDITS--
+Chris Wright <info@daverandom.com>
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+$doc = new DOMDocument;
+
+$doc->load(dirname(__FILE__)."/book-attr.xml");
+
+$doc->schemaValidate(dirname(__FILE__)."/book.xsd", LIBXML_SCHEMA_CREATE);
+
+foreach ($doc->getElementsByTagName('book') as $book) {
+    var_dump($book->getAttribute('is-hardback'));
+}
+
+?>
+--EXPECT--
+string(5) "false"
+string(4) "true"
index d4817deca0b4426986688c12bae50a53ecc7c4ea..9e4b6c4b7c963fb12ee5f5221f194389897d2266 100644 (file)
@@ -17,5 +17,5 @@ var_dump($result);
 
 ?>
 --EXPECTF--
-Warning: DOMDocument::schemaValidate() expects exactly 1 parameter, 0 given in %s.php on line %d
+Warning: DOMDocument::schemaValidate() expects at least 1 parameter, 0 given in %s.php on line %d
 NULL
index d3f0658c1f9f1961fcf331f62f904c181045807f..d5743bc6cf5c750b7fc7a654e133fa0b3535128f 100644 (file)
@@ -1,5 +1,5 @@
 --TEST--
-DomDocument::schemaValidate() - non-existant schema file
+DomDocument::schemaValidate() - non-existent schema file
 --CREDITS--
 Daniel Convissor <danielc@php.net>
 # TestFest 2009 NYPHP
@@ -12,14 +12,14 @@ $doc = new DOMDocument;
 
 $doc->load(dirname(__FILE__)."/book.xml");
 
-$result = $doc->schemaValidate(dirname(__FILE__)."/non-existant-file");
+$result = $doc->schemaValidate(dirname(__FILE__)."/non-existent-file");
 var_dump($result);
 
 ?>
 --EXPECTF--
-Warning: DOMDocument::schemaValidate(): I/O warning : failed to load external entity "%snon-existant-file" in %s.php on line %d
+Warning: DOMDocument::schemaValidate(): I/O warning : failed to load external entity "%snon-existent-file" in %s.php on line %d
 
-Warning: DOMDocument::schemaValidate(): Failed to locate the main schema resource at '%s/non-existant-file'. in %s.php on line %d
+Warning: DOMDocument::schemaValidate(): Failed to locate the main schema resource at '%s/non-existent-file'. in %s.php on line %d
 
 Warning: DOMDocument::schemaValidate(): Invalid Schema in %s.php on line %d
 bool(false)
diff --git a/ext/dom/tests/DOMDocument_schemaValidate_missingAttrs.phpt b/ext/dom/tests/DOMDocument_schemaValidate_missingAttrs.phpt
new file mode 100644 (file)
index 0000000..d253ad9
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+DomDocument::schemaValidate() - Don't add missing attribute default values from schema
+--CREDITS--
+Chris Wright <info@daverandom.com>
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+$doc = new DOMDocument;
+
+$doc->load(dirname(__FILE__)."/book-attr.xml");
+
+$doc->schemaValidate(dirname(__FILE__)."/book.xsd");
+
+foreach ($doc->getElementsByTagName('book') as $book) {
+    var_dump($book->getAttribute('is-hardback'));
+}
+
+?>
+--EXPECT--
+string(0) ""
+string(4) "true"
diff --git a/ext/dom/tests/book-attr.xml b/ext/dom/tests/book-attr.xml
new file mode 100644 (file)
index 0000000..ba4298d
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?>
+<books>
+ <book>
+  <title>The Grapes of Wrath</title>
+  <author>John Steinbeck</author>
+ </book>
+ <book is-hardback="true">
+  <title>The Pearl</title>
+  <author>John Steinbeck</author>
+ </book>
+</books>
index 45986fc4b3989160545c4cd33071b9696c7c4bd1..6b4a8ea54569c747830c4dd472773e07bf3a5663 100755 (executable)
@@ -9,6 +9,7 @@
        <xs:element name="title" type="xs:string"/>
        <xs:element name="author" type="xs:string"/>
       </xs:sequence>
+      <xs:attribute name="is-hardback" type="xs:boolean" default="false" use="optional" />
      </xs:complexType>
     </xs:element>
    </xs:sequence>
index b1cb45db7645e683a0b636d9de8088e25b74f791..354cb548a7a76ce9a3e0346c1ffdb6b67549d641 100644 (file)
@@ -44,6 +44,7 @@
 #include <libxml/xmlsave.h>
 #ifdef LIBXML_SCHEMAS_ENABLED
 #include <libxml/relaxng.h>
+#include <libxml/xmlschemas.h>
 #endif
 
 #include "php_libxml.h"
@@ -798,6 +799,11 @@ static PHP_MINIT_FUNCTION(libxml)
 #endif
        REGISTER_LONG_CONSTANT("LIBXML_NOEMPTYTAG",     LIBXML_SAVE_NOEMPTYTAG, CONST_CS | CONST_PERSISTENT);
 
+       /* Schema validation options */
+#if defined(LIBXML_SCHEMAS_ENABLED) && LIBXML_VERSION >= 20614
+       REGISTER_LONG_CONSTANT("LIBXML_SCHEMA_CREATE",  XML_SCHEMA_VAL_VC_I_CREATE,     CONST_CS | CONST_PERSISTENT);
+#endif
+
        /* Additional constants for use with loading html */
 #if LIBXML_VERSION >= 20707
        REGISTER_LONG_CONSTANT("LIBXML_HTML_NOIMPLIED", HTML_PARSE_NOIMPLIED,           CONST_CS | CONST_PERSISTENT);