a93709b19e38e59deb44f8207b31114d95dbfe7f
[roojs1] / docs / src / Roo_data_XmlReader.js.html
1 <html><head><title>/home/edward/gitlive/roojs1/Roo/data/XmlReader.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/*
2  * Based on:
3  * Ext JS Library 1.1.1
4  * Copyright(c) 2006-2007, Ext JS, LLC.
5  *
6  * Originally Released Under LGPL - original licence link has changed is not relivant.
7  *
8  * Fork - LGPL
9  * &lt;script type=&quot;text/javascript&quot;&gt;
10  */
11
12 /**
13  * @class Roo.data.XmlReader
14  * @extends Roo.data.DataReader
15  * Data reader class to create an Array of {@link Roo.data.Record} objects from an XML document
16  * based on mappings in a provided Roo.data.Record constructor.&lt;br&gt;&lt;br&gt;
17  * &lt;p&gt;
18  * &lt;em&gt;Note that in order for the browser to parse a returned XML document, the Content-Type
19  * header in the HTTP response must be set to &quot;text/xml&quot;.&lt;/em&gt;
20  * &lt;p&gt;
21  * Example code:
22  * &lt;pre&gt;&lt;code&gt;
23 var RecordDef = Roo.data.Record.create([
24    {name: 'name', mapping: 'name'},     // &quot;mapping&quot; property not needed if it's the same as &quot;name&quot;
25    {name: 'occupation'}                 // This field will use &quot;occupation&quot; as the mapping.
26 ]);
27 var myReader = new Roo.data.XmlReader({
28    totalRecords: &quot;results&quot;, // The element which contains the total dataset size (optional)
29    record: &quot;row&quot;,           // The repeated element which contains row information
30    id: &quot;id&quot;                 // The element within the row that provides an ID for the record (optional)
31 }, RecordDef);
32 &lt;/code&gt;&lt;/pre&gt;
33  * &lt;p&gt;
34  * This would consume an XML file like this:
35  * &lt;pre&gt;&lt;code&gt;
36 &amp;lt;?xml?&gt;
37 &amp;lt;dataset&gt;
38  &amp;lt;results&gt;2&amp;lt;/results&gt;
39  &amp;lt;row&gt;
40    &amp;lt;id&gt;1&amp;lt;/id&gt;
41    &amp;lt;name&gt;Bill&amp;lt;/name&gt;
42    &amp;lt;occupation&gt;Gardener&amp;lt;/occupation&gt;
43  &amp;lt;/row&gt;
44  &amp;lt;row&gt;
45    &amp;lt;id&gt;2&amp;lt;/id&gt;
46    &amp;lt;name&gt;Ben&amp;lt;/name&gt;
47    &amp;lt;occupation&gt;Horticulturalist&amp;lt;/occupation&gt;
48  &amp;lt;/row&gt;
49 &amp;lt;/dataset&gt;
50 &lt;/code&gt;&lt;/pre&gt;
51  * @cfg {String} totalRecords The DomQuery path from which to retrieve the total number of records
52  * in the dataset. This is only needed if the whole dataset is not passed in one go, but is being
53  * paged from the remote server.
54  * @cfg {String} record The DomQuery path to the repeated element which contains record information.
55  * @cfg {String} success The DomQuery path to the success attribute used by forms.
56  * @cfg {String} id The DomQuery path relative from the record element to the element that contains
57  * a record identifier value.
58  * @constructor
59  * Create a new XmlReader
60  * @param {Object} meta Metadata configuration options
61  * @param {Mixed} recordType The definition of the data record type to produce.  This can be either a valid
62  * Record subclass created with {@link Roo.data.Record#create}, or an array of objects with which to call
63  * Roo.data.Record.create.  See the {@link Roo.data.Record} class for more details.
64  */
65 </span><span class="jsdoc-var">Roo.data.XmlReader </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">meta</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">recordType</span><span class="jsdoc-syntax">){
66     </span><span class="jsdoc-var">meta </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">meta </span><span class="jsdoc-syntax">|| {};
67     </span><span class="jsdoc-var">Roo.data.XmlReader.superclass.constructor.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">meta</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">recordType</span><span class="jsdoc-syntax">||</span><span class="jsdoc-var">meta.fields</span><span class="jsdoc-syntax">);
68 };
69 </span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.data.XmlReader</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.data.DataReader</span><span class="jsdoc-syntax">, {
70     </span><span class="jsdoc-comment">/**
71      * This method is only used by a DataProxy which has retrieved data from a remote server.
72          * @param {Object} response The XHR object which contains the parsed XML document.  The response is expected
73          * to contain a method called 'responseXML' that returns an XML document object.
74      * @return {Object} records A data block which is used by an {@link Roo.data.Store} as
75      * a cache of Roo.data.Records.
76      */
77     </span><span class="jsdoc-var">read </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">response</span><span class="jsdoc-syntax">){
78         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">doc </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">response.responseXML</span><span class="jsdoc-syntax">;
79         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">doc</span><span class="jsdoc-syntax">) {
80             </span><span class="jsdoc-keyword">throw </span><span class="jsdoc-syntax">{</span><span class="jsdoc-var">message</span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">&quot;XmlReader.read: XML Document not available&quot;</span><span class="jsdoc-syntax">};
81         }
82         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.readRecords</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">doc</span><span class="jsdoc-syntax">);
83     },
84
85     </span><span class="jsdoc-comment">/**
86      * Create a data block containing Roo.data.Records from an XML document.
87          * @param {Object} doc A parsed XML document.
88      * @return {Object} records A data block which is used by an {@link Roo.data.Store} as
89      * a cache of Roo.data.Records.
90      */
91     </span><span class="jsdoc-var">readRecords </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">doc</span><span class="jsdoc-syntax">){
92         </span><span class="jsdoc-comment">/**
93          * After any data loads/reads, the raw XML Document is available for further custom processing.
94          * @type XMLDocument
95          */
96         </span><span class="jsdoc-var">this.xmlData </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc</span><span class="jsdoc-syntax">;
97         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">root </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.documentElement </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">doc</span><span class="jsdoc-syntax">;
98         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">q </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.DomQuery</span><span class="jsdoc-syntax">;
99         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">recordType </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.recordType</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">fields </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">recordType.prototype.fields</span><span class="jsdoc-syntax">;
100         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sid </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.meta.id</span><span class="jsdoc-syntax">;
101         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">totalRecords </span><span class="jsdoc-syntax">= 0, </span><span class="jsdoc-var">success </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
102         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.meta.totalRecords</span><span class="jsdoc-syntax">){
103             </span><span class="jsdoc-var">totalRecords </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">q.selectNumber</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.meta.totalRecords</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">root</span><span class="jsdoc-syntax">, 0);
104         }
105
106         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.meta.success</span><span class="jsdoc-syntax">){
107             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sv </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">q.selectValue</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.meta.success</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">root</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
108             </span><span class="jsdoc-var">success </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">sv </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">false </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">sv </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-string">'false'</span><span class="jsdoc-syntax">;
109         }
110         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">records </span><span class="jsdoc-syntax">= [];
111         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ns </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">q.select</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.meta.record</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">root</span><span class="jsdoc-syntax">);
112         </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0, </span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ns.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">++) {
113                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">n </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ns</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
114                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">values </span><span class="jsdoc-syntax">= {};
115                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">id </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">sid </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">q.selectValue</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sid</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-var">undefined</span><span class="jsdoc-syntax">;
116                 </span><span class="jsdoc-keyword">for</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">j </span><span class="jsdoc-syntax">= 0, </span><span class="jsdoc-var">jlen </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">fields.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">j </span><span class="jsdoc-syntax">&lt; </span><span class="jsdoc-var">jlen</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">j</span><span class="jsdoc-syntax">++){
117                     </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">f </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">fields.items</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">j</span><span class="jsdoc-syntax">];
118                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">v </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">q.selectValue</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">f.mapping </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">f.name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">f.defaultValue</span><span class="jsdoc-syntax">);
119                     </span><span class="jsdoc-var">v </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">f.convert</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">);
120                     </span><span class="jsdoc-var">values</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">f.name</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">v</span><span class="jsdoc-syntax">;
121                 }
122                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">record </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">recordType</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">values</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">);
123                 </span><span class="jsdoc-var">record.node </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">;
124                 </span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">records.length</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">record</span><span class="jsdoc-syntax">;
125             }
126
127             </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">{
128                 </span><span class="jsdoc-var">success </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">success</span><span class="jsdoc-syntax">,
129                 </span><span class="jsdoc-var">records </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">records</span><span class="jsdoc-syntax">,
130                 </span><span class="jsdoc-var">totalRecords </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">totalRecords </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">records.length
131             </span><span class="jsdoc-syntax">};
132     }
133 });</span></code></body></html>