At first, I learned XML Schema but found it hard to deal with unordered xml nodes, plus it’s not that easy to read.
I found out Relax NG, read the tutorial and well, it does the job pretty well!
- its syntax is self-explanatory
- it allows to do anything you can do with XML Schema, with greater flexibility (cf. you can load external file, define and extend matching-classes…)
- it’s far easier to read and memorize
- you can transparently deal with unordered xml nodes (cf. <interleave> node)
It looks like we can validate xml docs with both XML Schema and Relax-NG using php, at least from version 5.2 (cf. XMLReader class on php documentation) and using DOM from svn snapshot (v5.3)
Validators
If you want to validate your xml file agains Relax-NG (or XML Schema or DTD), good news for linux users! You can use xmllint (man xmllint), which is available from libxml2-utils package (“sudo apt-get install libxml2-utils”).
Then run “xmllint –noout –relaxng schema.rng file.xml”.
misc
Below is the XML Schema I started to write:
<?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- <query> "name" attribute pattern name is used as uri proxy => of the form: /[module]/[action] --> <xs:simpleType name="xsdQueryName"> <xs:restriction base="xs:string"> <xs:pattern value="/[a-zA-Z]+/[a-zA-Z]([a-zA-Z]|-)+"/> </xs:restriction> </xs:simpleType> <!-- <contact> in add-contact query --> <xs:complexType name="xsdContactToAdd"> <xs:all><!-- this type defaults minOccurs="1" and maxOccurs="1" --> <xsl:choice><!-- "user_fk" is provided when adding a new contact while "id" is provided when updating an existing contact --> <xs:element name="id" type="xs:positiveInteger"/> <xs:element name="user_fk" type="xs:positiveInteger"/> </xsl:choice> <xs:element name="email_address" type="xs:normalizedString"/> <xs:element name="first_name" type="xs:normalizedString" minOccurs="0"/> <xs:element name="last_name" type="xs:normalizedString" minOccurs="0"/> <xs:element name="company" type="xs:normalizedString" minOccurs="0"/> </xs:all> </xs:complexType> <!-- <contact> node --> <xs:element name="contact" type="xsdContactToAdd"/> <!-- <query> node --> <xs:complexType name="xsdQuery" mixed="true"> <xs:sequence> <xs:element name="contact"/> </xs:sequence> <xs:attribute name="name" type="xsdQueryName" use="required"/> </xs:complexType> <xs:element name="query" type="xsdQuery"/> </xs:schema>
Not crystal clear, even though I used comments and split validations into sub-units to have a clearer doc
sources
- http://www.oasis-open.org/committees/relax-ng/tutorial.html Relax-NG official tutorial
- http://www.w3schools.com/schema/default.asp Learn XML Schema online with w3schools.com
- http://es.php.net/manual/en/xmlreader.setrelaxngschemasource.php
- http://es.php.net/manual/en/domdocument.relaxngvalidatesource.php
- http://www.validome.org/xml/validate/ online xml validator, accept DTD and XML Schema as validation rules
- http://www.w3.org/TR/xmlschema-1/ Official w3c XML Schema Technical Report
- http://www.oasis-open.org/committees/relax-ng/spec-20011203.html Relax-NG official specs.
- http://www.webreference.com/xml/column59/ XML Schema vs. Relax-NG quick (biaised) comparison
- http://infohost.nmt.edu/tcc/help/xml/lint.html
One Trackback