dataschema-xml.js revision 3a38d5b7ad9ebee258ce6cb2ebe712f058ea27c5
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The DataSchema utility provides a common configurable interface for widgets to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * apply a given schema to a variety of data.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @module dataschema
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * XML subclass for the YUI DataSchema utility.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @extends DataSchema.Base
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // DataSchema.XML static methods
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Returns string name.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method toString
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {String} String representation for this object.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass toString: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Applies a given schema to given XML data.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method apply
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param schema {Object} Schema to apply.
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai * @param data {XMLDoc} XML document.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Object} Schema-parsed data.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Parse results data
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass data_out = SchemaXML._parseResults(schema, xmldoc, data_out);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Parse meta data
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass data_out = SchemaXML._parseMeta(schema.metaFields, xmldoc, data_out);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass data_out.error = new Error(this.toString() + " Schema parse failure");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Get an XPath-specified value for a given field from an XML node or document.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _getLocationValue
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param field {String | Object} Field definition.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param context {Object} XML node or document to search within.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Object} Data value or null.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var locator = field.locator || field.key || field,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Standards mode
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass result = xmldoc.evaluate(locator, context, xmldoc.createNSResolver(!context.ownerDocument ? context.documentElement : context.ownerDocument.documentElement), 0, null);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Parses results data according to schema
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _parseMeta
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param xmldoc_in {Object} XML document parse.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param data_out {Object} In-progress schema-parsed data to update.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Object} Schema-parsed data.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _parseMeta: function(metaFields, xmldoc_in, data_out) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass data_out.meta[key] = SchemaXML._getLocationValue(metaFields[key], xmldoc);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Schema-parsed list of results from full data
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _parseResults
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param schema {Object} Schema to parse against.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param xmldoc_in {Object} XML document parse.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param data_out {Object} In-progress schema-parsed data to update.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Object} Schema-parsed data.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _parseResults: function(schema, xmldoc_in, data_out) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(schema.resultsLocator && LANG.isArray(schema.resultsFields)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var nodeList = xmldoc_in.getElementsByTagName(schema.resultsLocator),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Loop through each result node
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Find each field value
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass result[field.key || field] = SchemaXML._getLocationValue(field, node);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass data_out.error = new Error(this.toString() + " Result nodes retrieval failure");