将XML响应映射到数据记录(Smartgwt)

时间:2011-10-02 15:11:12

标签: gwt smartgwt

我已经将RestDatasource子类化以创建我自己的数据源。这是我的Datasource的构造函数

    public CustomDS (){
     setDataProtocol(DSProtocol.POSTMESSAGE);
     setDataFormat(DSDataFormat.XML);

     DataSourceTextField firstNameField = new DataSourceTextField("firstName", "First Name");
     DataSourceTextField lastNameField = new DataSourceTextField("lastName", "Last Name");
     DataSourceTextField userIDField = new DataSourceTextField("id", "User ID");

     setFields(firstNameField, lastNameField, userIDField);

     setXmlRecordXPath("/qm:GetResultsResponse/*");
     XmlNamespaces ns = new XmlNamespaces();
     ns.addNamespace("qm", "someurl");
     setXmlNamespaces(ns);

}

这是xml响应

 <?xml version="1.0" encoding="UTF-8"?>
 <qm:GetResultsResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:qm="someurl" xmlns:warehouse="someurl">
   <records xsi:type="warehouse:User" id="id1" firstName="fname1" lastName="Reddy">
     <voiceUserProperties languageId="en-US"/>
    </records>
   <records xsi:type="warehouse:User" id="id2" firstName="fname3" lastName="Reddy">
    <voiceUserProperties languageId="en-US"/>
   </records>
   <records xsi:type="warehouse:User" id="id3" firstName="fnam4" lastName="Reddy">
     <voiceUserProperties languageId="en-US"/>
   </records>
 </qm:GetResultsResponse>

问题

在transformResponse()方法中,response.getDataAsRecordList()。getLength()返回3,但我似乎无法用必需的属性填充记录(即firstName,id,lastName)。有谁在这看错了什么?

修改 正如所建议的那样,我将数据源更改为从DataSource扩展而不是RestDataSource。我还有这个问题。 如果我从XML中删除xsi:type =“warehouse:User”,这可以正常工作。关于这个的任何想法?

1 个答案:

答案 0 :(得分:1)

如果您正在尝试解析自己所显示的自定义格式,请不要将RestDataSource子类化,只将子类化为DataSource。 RestDataSource有很多特定于它所期望的消息格式的设置,它具有比你想要解析的结构更多的结构。

..现在你正在使用DataSource - 如果可以的话,去除xsi:type声明,因为它们是浪费的字节。但是,如果您获取每晚构建(来自smartclient.com/builds),您将看到在处理XML时现在忽略这些声明,除非该类型引用您声明的特定数据源。