2016-03-24 8 views
0

Ich brauche Hilfe bitte ...SmartGWT nicht in der Lage Daten in der DataSource.transformResponse() -Methode zu analysieren

ich mit GWT arbeite Web-Anwendung aktiviert. Ich benutze das gwt-2.3.0 SDK.

Ich habe eine Methode, die die Datasource-Klasse und verwendet die transformResponse Methode erweitert:

public class DeathRecordXmlDS extends DataSource { 

protected void transformResponse(DSResponse response, DSRequest request, Object data){ 
    super.transformResponse(response, request, data); 
} 

} 

Wie ich verstehe, die transformResponse() Methode sollte die Kontrolle bekommen und an diesem Punkt werde ich Zugriff auf die Daten haben Dies wird auf der Client-Seite meiner Anwendung zur Verfügung gestellt. Ich versuche, mit dem übergebenen Objektdatenparameter (der dritte Parameter) zu arbeiten.

Ich erwarte, dass eine XML-formatierte Zeichenfolge übergeben wird. Die XML wird Daten (ein Zählfeld) enthalten, die ich benötige Zugang und Nutzung.

Ich bekomme keine XML-Zeichenfolge. Hier ist, was ich weiß ...

Ich sehe die XML-Daten an meine Webapp (der Client) übergeben. Ich kann dies sehen, weil ich die Webseite, mit der ich arbeite, inspiziere und die Antwortdaten sehe. Hier ist ein Beispiel für etwas, das ich erwarte zu erhalten:

XML data from Query: 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Collection numRecords="0"> 
    <DeathRecords/> 
</Collection> 

Die obige XML gültig ist (Ich habe es in einem Validator). Dies ist ein Fall, in dem keine Daten (keine Todesdaten) an meine Anwendung zurückgegeben wurden. Das XML-Attribut numRecords ist auf "0" festgelegt. Natürlich, wenn ich Datensätze zurückgegeben habe, wird die Anzahl der Datensätze in den numRecords enthalten sein und ich werde die gleiche Anzahl von DeathRecord Knoten bekommen.

Ich bekomme nicht die oben genannten Daten (oder, ich weiß nicht, wie man damit arbeitet) in der transformResponse() - Methode.

Hier ist, was ich getan habe, um zu versuchen, das herauszufinden ...

Der Objektdatenparameter ... es ist ein JavaScriptObject ist. Ich weiß das, weil ich ein .getClass tat() getName() auf sie.

DeathRecordXmlDS::transformResponse()  data.getClass().getName(): com.google.gwt.core.client.JavaScriptObject$ 

Dann zu versuchen, mit ihm zu arbeiten, ich habe es in einen String konvertiert:

 com.google.gwt.core.client.JavaScriptObject dataJS = (com.google.gwt.core.client.JavaScriptObject)data; 
    System.out.println("DeathRecordXmlDS::transformResponse()  data as a JavaScriptObject: "+dataJS.toString()); 

Der Inhalt Blick von ‚data‘ als String formatiert wie:

DeathRecordXmlDS::transformResponse()  data as a JavaScriptObject: [XMLDoc <Collection>] 

Also, es sieht aus wie ich etwas haben, das mit meinem ‚Collection‘ Knoten zu tun hat, aber nicht ein String von XML-Daten, die ich analysieren und erhalten zu meinem numRecords-Attribut.

Was muss ich tun, um in der transformResponse() - Methode auf XML zugreifen zu können?

Danke!

Antwort

0

Nach einer weiteren Zeit daran arbeiten konnte ich die XML-Daten lesen, mit denen ich arbeite. Ich benutze das folgende Stück Code:

try{ 
     JsArray<JavaScriptObject> nodes = ((JavaScriptObject) XMLTools.selectNodes(data, "/Collection/@numRecords")).cast(); 

     for (int i = 0; i < nodes.length(); i++) { 
      com.google.gwt.dom.client.Element element = (com.google.gwt.dom.client.Element) nodes.get(i); 

      numRecords = element.getNodeValue(); 
     } 

    } catch(Exception e){ 
     // If Parsing fails, capture the exception 
     System.out.println("DeathRecordXmlDS::transformResponse()  Not able to parse the XML"); 
    } 

Ich denke, der erste Schritt, um diese zu lösen, wurde das Verständnis, dass der Parameter ‚Daten‘ vom Typ Object war wirklich ein JavaScriptObject. Ich habe dies nach dem Betrachten der .getClass() und .getName() gelernt. Das half mir zu verstehen, was ich arbeite mit:

System.out.println("DeathRecordXmlDS::transformResponse()  data.getClass().getName(): "+data.getClass().getName()); 

Sobald ich wusste, es war ein JavaScriptObject, ich in der Lage war, ein wenig mehr konzentriert von einer Google-Suche zu tun, was ich versucht habe zu erreichen. Ich war ein wenig überrascht, dass die Funktion XMLTools.selectNodes() so funktionierte wie ich, aber das Ergebnis war, dass ich das Attribut numRecords lesen konnte.

Danke für den Vorschlag!

0

Ich denke, Ihr Datenobjekt wurde bereits in eine Javascript-Sammlung übersetzt.

Vielleicht könnten Sie die Utility-Klasse verwenden XMLTools Ihre AnzDatensätze Informationen abzurufen:

Integer numRecords = Integer.parseInt(XMLTools.selectString(data, "Collection/@numRecords")); 
+1

Ich habe nicht erwähnt, dass der Code, mit dem ich arbeite, verwendet die sehr XMLTools-Funktion, die Sie erwähnen. Ich glaube, es hat funktioniert (ich nehme an), aber jetzt gibt die selectString-Funktion eine leere Zeichenfolge zurück. Ich arbeite einfach nicht. Ich suchte nach einem neuen Weg, um das Problem zu lösen (Lesen des numRecords-Wertes). Möglicherweise über die XML-Struktur iterieren. – SBParks

+0

Ich bin auf das gleiche Problem gestoßen. Vorhandener Code in meinem Projekt bedeutet, dass mit XMLTools eine Zeichenfolge direkt aus dem Parameter rawData ausgewählt wird, der verwendet wird. In meiner Verwendung gibt dies jedoch nur null zurück, obwohl mein XML korrekt formatiert ist. Ich bin interessiert zu wissen, ob etwas anderes angegeben werden muss, um die XML-Rohdaten zu erhalten, anstatt sie in JSOs zu konvertieren. – Tom