dataschema-xml-debug.js revision f805ad34c19740fa0c9729ce35fe59d191912f32
/**
Provides a DataSchema implementation which can be used to work with XML data.
@module dataschema
@submodule dataschema-xml
**/
/**
Provides a DataSchema implementation which can be used to work with XML data.
See the `apply` method for usage.
@class DataSchema.XML
@extends DataSchema.Base
@static
**/
okNodeType = {
1 : true,
9 : true,
11: true
},
SchemaXML = {
////////////////////////////////////////////////////////////////////////////
//
// DataSchema.XML static methods
//
////////////////////////////////////////////////////////////////////////////
/**
Applies a schema to an XML data tree, returning a normalized object with
results in the `results` property. Additional information can be parsed out
of the XML for inclusion in the `meta` property of the response object. If
an error is encountered during processing, an `error` property will be
added.
Field data in the nodes captured by the XPath in _schema.resultListLocator_
is extracted with the field identifiers described in _schema.resultFields_.
Field identifiers are objects with the following properties:
* `key` : <strong>(required)</strong> The desired property name to use
store the retrieved value in the result object. If `locator` is
not specified, `key` is also used as the XPath locator (String)
* `locator`: The XPath locator to the node or attribute within each
result node found by _schema.resultListLocator_ containing the
desired field data (String)
* `parser` : A function or the name of a function on `Y.Parsers` used
to convert the input value into a normalized type. Parser
functions are passed the value as input and are expected to
return a value.
* `schema` : Used to retrieve nested field data into an array for
assignment as the result field value. This object follows the same
conventions as _schema_.
If no value parsing or nested parsing is needed, you can use XPath locators
(strings) instead of field identifiers (objects) -- see example below.
`response.results` will contain an array of objects with key:value pairs.
The keys are the field identifier `key`s, and the values are the data
values extracted from the nodes or attributes found by the field `locator`
(or `key` fallback).
To extract additional information from the XML, include an array of
XPath locators in _schema.metaFields_. The collected values will be
stored in `response.meta` with the XPath locator as keys.
@example
var schema = {
resultFields: [
{
locator: 'name',
key: 'name'
},
{
locator: 'color',
key: 'color',
parser: function (val) { return val.toUpperCase(); }
}
]
};
// Assumes data like
// <inventory>
// <produce>
// <item><name>Banana</name><color>yellow</color></item>
// <item><name>Orange</name><color>orange</color></item>
// <item><name>Eggplant</name><color>purple</color></item>
// </produce>
// </inventory>
var response = Y.DataSchema.JSON.apply(schema, data);
// response.results[0] is { name: "Banana", color: "YELLOW" }
@method apply
@param {Object} schema Schema to apply. Supported configuration
properties are:
@param {String} [schema.resultListLocator] XPath locator for the
XML nodes that contain the data to flatten into `response.results`
@param {Array} [schema.resultFields] Field identifiers to
details.
@param {Array} [schema.metaFields] XPath locators to extract extra
non-record related information from the XML data
@param {XMLDoc} data XML data to parse
@return {Object} An Object with properties `results` and `meta`
@static
**/
// Parse results data
// Parse meta data
} else {
Y.log("XML data could not be schema-parsed: " + Y.dump(data) + " " + Y.dump(data), "error", "dataschema-xml");
}
return data_out;
},
/**
* Get an XPath-specified value for a given field from an XML node or document.
*
* @method _getLocationValue
* @param field {String | Object} Field definition.
* @param context {Object} XML node or document to search within.
* @return {Object} Data value or null.
* @static
* @protected
*/
try {
}
// FIXME: Why defer to a method that is mixed into this object?
// DSchema.Base is mixed into DSchema.XML (et al), so
// DSchema.XML.parse(...) will work. This supports the use case
// where DSchema.Base.parse is changed, and that change is then
// seen by all DSchema.* implementations, but does not support the
// case where redefining DSchema.XML.parse changes behavior. In
// fact, DSchema.XML.parse is never even called.
} catch (e) {
}
return null;
},
/**
* Fetches the XPath-specified result for a given location in an XML node or document.
*
* @param locator {String} The XPath location.
* @param context {Object} XML node or document to search within.
* @param xmldoc {Object} XML document to resolve namespace.
* @return {Object} Data collection or null.
* @static
* @protected
*/
// Standards mode
return xmldoc.evaluate(locator, context, xmldoc.createNSResolver(context.ownerDocument ? context.ownerDocument.documentElement : context.documentElement), 0, null);
}
// IE mode
else {
var values=[], locatorArray = locator.split(/\b\/\b/), i=0, l=locatorArray.length, location, subloc, m, isNth;
// XPath is supported
try {
// this fixes the IE 5.5+ issue where childnode selectors begin at 0 instead of 1
}
// Fallback for DOM nodes and fragments
catch (e) {
// Iterate over each locator piece
for (; i<l && context; i++) {
location = locatorArray[i];
// grab nth child []
//XPath is 1-based while DOM is 0-based
subloc--;
isNth = true;
}
// grab attribute value @
}
// grab that last instance of tagName
}
// find the last matching location in children
else if (l != i + 1) {
m = -1;
}
}
}
}
if (context) {
// attribute
}
// nth child
else if (isNth) {
}
// all children
else {
}
}
}
// returning a mock-standard object for IE
return {
index: 0,
iterateNext: function() {
this.index += 1;
return result;
},
};
}
},
/**
* Schema-parsed result field.
*
* @method _parseField
* @param field {String | Object} Required. Field definition.
* @param result {Object} Required. Schema parsed data object.
* @param context {Object} Required. XML node or document to search within.
* @static
* @protected
*/
} else {
}
},
/**
* Parses results data according to schema
*
* @method _parseMeta
* @param xmldoc_in {Object} XML document parse.
* @param data_out {Object} In-progress schema-parsed data to update.
* @return {Object} Schema-parsed data.
* @static
* @protected
*/
var key,
for(key in metaFields) {
}
}
}
return data_out;
},
/**
* Schema-parsed result to add to results list.
*
* @method _parseResult
* @param fields {Array} Required. A collection of field definition.
* @param context {Object} Required. XML node or document to search within.
* @return {Object} Schema-parsed data.
* @static
* @protected
*/
var result = {}, j;
// Find each field value
}
return result;
},
/**
* Schema-parsed list of results from full data
*
* @method _parseResults
* @param schema {Object} Schema to parse against.
* @param context {Object} XML node or document to parse.
* @param data_out {Object} In-progress schema-parsed data to update.
* @return {Object} Schema-parsed data.
* @static
* @protected
*/
results = [],
// loop through each result node
}
} else {
// loop through the nodelist
i += 1;
}
}
} else {
}
}
return data_out;
}
};