data-xml-debug.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:9k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.0.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /**  * @class Ext.data.XmlWriter  * @extends Ext.data.DataWriter  * DataWriter extension for writing an array or single {@link Ext.data.Record} object(s) in preparation for executing a remote CRUD action via XML.  */ Ext.data.XmlWriter = Ext.extend(Ext.data.DataWriter, {     /**      * Final action of a write event.  Apply the written data-object to params.      * @param {String} action [Ext.data.Api.create|read|update|destroy]      * @param {Record[]} rs      * @param {Object} http params      * @param {Object} data object populated according to DataReader meta-data "root" and "idProperty"      */     render : function(action, rs, params, data) {         // no impl.     },     /**      * createRecord      * @param {Ext.data.Record} rec      */     createRecord : function(rec) {         // no impl     },     /**      * updateRecord      * @param {Ext.data.Record} rec      */     updateRecord : function(rec) {         // no impl.     },     /**      * destroyRecord      * @param {Ext.data.Record} rec      */     destroyRecord : function(rec) {         // no impl     } });/**  * @class Ext.data.XmlReader  * @extends Ext.data.DataReader  * <p>Data reader class to create an Array of {@link Ext.data.Record} objects from an XML document  * based on mappings in a provided {@link Ext.data.Record} constructor.</p>  * <p><b>Note</b>: that in order for the browser to parse a returned XML document, the Content-Type  * header in the HTTP response must be set to "text/xml" or "application/xml".</p>  * <p>Example code:</p>  * <pre><code> var Employee = Ext.data.Record.create([    {name: 'name', mapping: 'name'},     // "mapping" property not needed if it is the same as "name"    {name: 'occupation'}                 // This field will use "occupation" as the mapping. ]); var myReader = new Ext.data.XmlReader({    totalRecords: "results", // The element which contains the total dataset size (optional)    record: "row",           // The repeated element which contains row information    id: "id"                 // The element within the row that provides an ID for the record (optional) }, Employee); </code></pre>  * <p>  * This would consume an XML file like this:  * <pre><code> &lt;?xml version="1.0" encoding="UTF-8"?> &lt;dataset>  &lt;results>2&lt;/results>  &lt;row>    &lt;id>1&lt;/id>    &lt;name>Bill&lt;/name>    &lt;occupation>Gardener&lt;/occupation>  &lt;/row>  &lt;row>    &lt;id>2&lt;/id>    &lt;name>Ben&lt;/name>    &lt;occupation>Horticulturalist&lt;/occupation>  &lt;/row> &lt;/dataset> </code></pre>  * @cfg {String} totalRecords The DomQuery path from which to retrieve the total number of records  * in the dataset. This is only needed if the whole dataset is not passed in one go, but is being  * paged from the remote server.  * @cfg {String} record The DomQuery path to the repeated element which contains record information.  * @cfg {String} success The DomQuery path to the success attribute used by forms.  * @cfg {String} idPath The DomQuery path relative from the record element to the element that contains  * a record identifier value.  * @constructor  * Create a new XmlReader.  * @param {Object} meta Metadata configuration options  * @param {Object} recordType Either an Array of field definition objects as passed to  * {@link Ext.data.Record#create}, or a Record constructor object created using {@link Ext.data.Record#create}.  */ Ext.data.XmlReader = function(meta, recordType){     meta = meta || {};     Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType || meta.fields); }; Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {     /**      * This method is only used by a DataProxy which has retrieved data from a remote server.      * @param {Object} response The XHR object which contains the parsed XML document.  The response is expected      * to contain a property called <tt>responseXML</tt> which refers to an XML document object.      * @return {Object} records A data block which is used by an {@link Ext.data.Store} as      * a cache of Ext.data.Records.      */     read : function(response){         var doc = response.responseXML;         if(!doc) {             throw {message: "XmlReader.read: XML Document not available"};         }         return this.readRecords(doc);     },     /**      * Create a data block containing Ext.data.Records from an XML document.      * @param {Object} doc A parsed XML document.      * @return {Object} records A data block which is used by an {@link Ext.data.Store} as      * a cache of Ext.data.Records.      */     readRecords : function(doc){         /**          * After any data loads/reads, the raw XML Document is available for further custom processing.          * @type XMLDocument          */         this.xmlData = doc;         var root = doc.documentElement || doc;         var q = Ext.DomQuery;         var recordType = this.recordType, fields = recordType.prototype.fields;         var sid = this.meta.idPath || this.meta.id;         var totalRecords = 0, success = true;         if(this.meta.totalRecords){             totalRecords = q.selectNumber(this.meta.totalRecords, root, 0);         }         if(this.meta.success){             var sv = q.selectValue(this.meta.success, root, true);             success = sv !== false && sv !== 'false';         }         var records = [];         var ns = q.select(this.meta.record, root);         for(var i = 0, len = ns.length; i < len; i++) {             var n = ns[i];             var values = {};             var id = sid ? q.selectValue(sid, n) : undefined;             for(var j = 0, jlen = fields.length; j < jlen; j++){                 var f = fields.items[j];                 var v = q.selectValue(Ext.value(f.mapping, f.name, true), n, f.defaultValue);                 v = f.convert(v, n);                 values[f.name] = v;             }             var record = new recordType(values, id);             record.node = n;             records[records.length] = record;         }         return {             success : success,             records : records,             totalRecords : totalRecords || records.length         };     },     // TODO: implement readResponse for XmlReader     readResponse : Ext.emptyFn });/**
  2.  * @class Ext.data.XmlStore
  3.  * @extends Ext.data.Store
  4.  * <p>Small helper class to make creating {@link Ext.data.Store}s from XML data easier.
  5.  * A XmlStore will be automatically configured with a {@link Ext.data.XmlReader}.</p>
  6.  * <p>A store configuration would be something like:<pre><code>
  7. var store = new Ext.data.XmlStore({
  8.     // store configs
  9.     autoDestroy: true,
  10.     storeId: 'myStore',
  11.     url: 'sheldon.xml', // automatically configures a HttpProxy
  12.     // reader configs
  13.     record: 'Item', // records will have an "Item" tag
  14.     idPath: 'ASIN',
  15.     totalRecords: '@TotalResults'
  16.     fields: [
  17.         // set up the fields mapping into the xml doc
  18.         // The first needs mapping, the others are very basic
  19.         {name: 'Author', mapping: 'ItemAttributes > Author'},
  20.         'Title', 'Manufacturer', 'ProductGroup'
  21.     ]
  22. });
  23.  * </code></pre></p>
  24.  * <p>This store is configured to consume a returned object of the form:<pre><code>
  25. &#60?xml version="1.0" encoding="UTF-8"?>
  26. &#60ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-05-15">
  27.     &#60Items>
  28.         &#60Request>
  29.             &#60IsValid>True&#60/IsValid>
  30.             &#60ItemSearchRequest>
  31.                 &#60Author>Sidney Sheldon&#60/Author>
  32.                 &#60SearchIndex>Books&#60/SearchIndex>
  33.             &#60/ItemSearchRequest>
  34.         &#60/Request>
  35.         &#60TotalResults>203&#60/TotalResults>
  36.         &#60TotalPages>21&#60/TotalPages>
  37.         &#60Item>
  38.             &#60ASIN>0446355453&#60/ASIN>
  39.             &#60DetailPageURL>
  40.                 http://www.amazon.com/
  41.             &#60/DetailPageURL>
  42.             &#60ItemAttributes>
  43.                 &#60Author>Sidney Sheldon&#60/Author>
  44.                 &#60Manufacturer>Warner Books&#60/Manufacturer>
  45.                 &#60ProductGroup>Book&#60/ProductGroup>
  46.                 &#60Title>Master of the Game&#60/Title>
  47.             &#60/ItemAttributes>
  48.         &#60/Item>
  49.     &#60/Items>
  50. &#60/ItemSearchResponse>
  51.  * </code></pre>
  52.  * An object literal of this form could also be used as the {@link #data} config option.</p>
  53.  * <p><b>Note:</b> Although not listed here, this class accepts all of the configuration options of 
  54.  * <b>{@link Ext.data.XmlReader XmlReader}</b>.</p>
  55.  * @constructor
  56.  * @param {Object} config
  57.  * @xtype xmlstore
  58.  */
  59. Ext.data.XmlStore = Ext.extend(Ext.data.Store, {
  60.     /**
  61.      * @cfg {Ext.data.DataReader} reader @hide
  62.      */
  63.     constructor: function(config){
  64.         Ext.data.XmlStore.superclass.constructor.call(this, Ext.apply(config, {
  65.             reader: new Ext.data.XmlReader(config)
  66.         }));
  67.     }
  68. });
  69. Ext.reg('xmlstore', Ext.data.XmlStore);