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">/*
4 * Copyright(c) 2006-2007, Ext JS, LLC.
6 * Originally Released Under LGPL - original licence link has changed is not relivant.
9 * <script type="text/javascript">
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.<br><br>
18 * <em>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 "text/xml".</em>
22 * <pre><code>
23 var RecordDef = Roo.data.Record.create([
24 {name: 'name', mapping: 'name'}, // "mapping" property not needed if it's the same as "name"
25 {name: 'occupation'} // This field will use "occupation" as the mapping.
27 var myReader = new Roo.data.XmlReader({
28 totalRecords: "results", // The element which contains the total dataset size (optional)
29 record: "row", // The repeated element which contains row information
30 id: "id" // The element within the row that provides an ID for the record (optional)
32 </code></pre>
34 * This would consume an XML file like this:
35 * <pre><code>
38 &lt;results>2&lt;/results>
40 &lt;id>1&lt;/id>
41 &lt;name>Bill&lt;/name>
42 &lt;occupation>Gardener&lt;/occupation>
45 &lt;id>2&lt;/id>
46 &lt;name>Ben&lt;/name>
47 &lt;occupation>Horticulturalist&lt;/occupation>
50 </code></pre>
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.
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.
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">);
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.
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">"XmlReader.read: XML Document not available"</span><span class="jsdoc-syntax">};
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">);
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.
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.
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);
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">&& </span><span class="jsdoc-var">sv </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-string">'false'</span><span class="jsdoc-syntax">;
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">< </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">< </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">;
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">;
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">};
133 });</span></code></body></html>