Отображение XML-ответов на записи данных (Smartgwt) - PullRequest
1 голос
/ 02 октября 2011

Я создал подкласс RestDatasource для создания собственного источника данных.Это конструктор моего источника данных

    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.У меня все еще есть эта проблема.Если я удалю xsi: type = "warehouse: User" из XML, это работает нормально.Есть идеи по этому поводу?

1 Ответ

1 голос
/ 02 октября 2011

Если вы пытаетесь проанализировать пользовательский формат, как вы показали, не делайте подкласс RestDataSource, делайте подкласс просто DataSource. RestDataSource имеет множество настроек, специфичных для ожидаемого формата сообщения, который имеет гораздо большую структуру, чем то, что вы пытаетесь проанализировать.

.. теперь, когда вы используете вместо этого DataSource - если можете, избавьтесь от объявлений типа xsi:, поскольку они являются бесполезными байтами. Однако если вы возьмете ночную сборку (со страницы smartclient.com/builds), вы увидите, что эти объявления теперь игнорируются при обработке XML, если тип не ссылается на определенный источник данных, который вы объявили.

...