差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:web:ext:xmlparser [2013/07/11 13:36]
tony
java:web:ext:xmlparser [2023/06/25 09:48] (目前版本)
行 22: 行 22:
 <code xml> <code xml>
 <​result>​ <​result>​
-  <​status>​success</​status>​ +  <​status>​false</​status>​ 
-  <​msg></​msg>​+  <msg>Validation failed.</​msg>​
 </​result>​ </​result>​
 </​code>​ </​code>​
行 29: 行 29:
 一般正規的原始做法如下:​ {{:​java:​web:​ext:​example_xml_parser.zip|Download Sample}} 一般正規的原始做法如下:​ {{:​java:​web:​ext:​example_xml_parser.zip|Download Sample}}
 <code javascript>​ <code javascript>​
-var text = "<​result><​status>​success</​status><​msg>​test msg</​msg></​result>";​+var text = "<​result><​status>​false</​status><​msg>​test msg</​msg></​result>";​
  
 var xmlDoc = null; var xmlDoc = null;
行 48: 行 48:
 雖然說在ExtJS中取得的response.responseXML已經是DOM Document物件,但要去retrieve DOM Element還是必須根據不同瀏覽器要有不同做法。可以參考這個[[http://​www.w3schools.com/​dom/​dom_document.asp|連結]]中對DOM Document各屬性與方法的瀏覽器支援表。重點是在ExtJS中,有什麼較一致的做法呢?​ 雖然說在ExtJS中取得的response.responseXML已經是DOM Document物件,但要去retrieve DOM Element還是必須根據不同瀏覽器要有不同做法。可以參考這個[[http://​www.w3schools.com/​dom/​dom_document.asp|連結]]中對DOM Document各屬性與方法的瀏覽器支援表。重點是在ExtJS中,有什麼較一致的做法呢?​
 ===== How to? ===== ===== How to? =====
 +一開始我就想到應該可以用[[http://​docs.sencha.com/​extjs/​4.1.3/#​!/​api/​Ext.data.reader.Xml|XMLReader]],但看看sample卻發現要直接取用Element中的資料並不是那麼容易,而且Reader大都與Store搭配。於是我想:​ 我可以定義一個描述XML的Model,再透過Store去存取它。由於我Server-Side回應Client的格式大都一樣,所以定義對應的model可以讓我之後reuse:​ 
 +<code javascript>​ 
 +Ext.define('​ServerResponseModel',​ {     
 +   ​ extend:​ '​Ext.data.Model',​ 
 +       ​fields:​ ['​status',​ '​msg'​] 
 +}); 
 +    
 +Ext.define('​ServerResponseStore',​ { 
 + extend: '​Ext.data.Store',​ 
 + model: '​ServerResponseModel',​ 
 +    proxy: { 
 +    type: '​memory',​ 
 +        reader: { 
 +        type: '​xml',​ 
 +        record: '​result', ​                     
 +      } 
 +    } 
 +});  
 +</​code>​ 
 +在這存取資料的Proxy使用了memory的type。以往都是使用Ajax的方式取得後端資料讓reader做處理,但因為我們已取得Server回傳的資料,所以需存取的是local的變數:​ response.responseXML。\\ 
 +首先透過Ext.create去產生ServerResponseStore的instance,接著透過loadRawData去讀取DOM Document,最後我們就可以透過getAt取得對應的record(result element)。拿到record後,我們就可以使用get去取得對應的內容了。 
 +<code javascript>​ 
 +success: function(response){ 
 +  var xml = response.responseXML;​ 
 +  var store = Ext.create('​ServerResponseStore'​);​ 
 +             
 +  store.loadRawData(xml);​ 
 +             
 +  var result = store.getAt(0);​ 
 +             
 +  var msg = result.get('​msg'​);​ 
 +  var status = result.get('​status'​);​ 
 +  if( status == '​false'​ ){ 
 +    window.alert('​Failed:'​ + msg); 
 +  } else { 
 +    window.alert('​Execute command successfully.'​);​ 
 +  } 
 +
 +</​code>​ 
 +\\ 
 +友藏內心獨白:​ 寫ExtJS其實花的時間比寫一般Javasript還花時間! 可能還不夠熟悉吧!
 ===== Reference ===== ===== Reference =====
   * [[http://​javaclaus.wordpress.com/​2010/​10/​12/​extjs-xml-and-the-dom/​|ExtJS,​ XML, and the DOM]]   * [[http://​javaclaus.wordpress.com/​2010/​10/​12/​extjs-xml-and-the-dom/​|ExtJS,​ XML, and the DOM]]
   * [[http://​help.dottoro.com/​ljssopjn.php|Dotoro - DOM Parser]]   * [[http://​help.dottoro.com/​ljssopjn.php|Dotoro - DOM Parser]]
 +
 +=====    =====
 +----
 +\\
 +~~DISQUS~~