使用 GWT 读取一个非常大的本地 XML 文件

Posted

技术标签:

【中文标题】使用 GWT 读取一个非常大的本地 XML 文件【英文标题】:Reading a very large local XML file using GWT 【发布时间】:2011-10-28 01:41:19 【问题描述】:

我正在使用 GWT 构建我的第一个 Java 应用程序,它必须从一个非常大的 XML 文件中读取数据。当我尝试发送对文件中信息的请求时遇到问题,我不太确定它是否与文件的大小或我的语义有关。在我的程序中,我有以下内容:

static final String xmlurl = "filename.xml";
String xmlData;

...

public void onModuleLoad() 
requestData(xmlurl);
if(xmlData.equals("Error"))
    // display error message
    return;
 else 
    // display the xml


void requestData(String url)
    final int STATUS_CODE = 200;

    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
    try 
         builder.setTimeoutMillis(2000);
         builder.sendRequest(null, new RequestCallback() 
              public void onError(Request request, Throwable exception) 
                   xmlData = "Error" 
              

              public void onResponseReceived(Request request, Response response)  
                   if (STATUS_CODE == response.getStatusCode())
                        xmlData = response.getText();
                    else 
                        xmlData = "Error";
                   
              
         
     catch (RequestException e) 
         xmlData = "Error";
    

我重写了代码,所以我可能写了一些错字,但对于实际的应用程序,它编译并运行。问题是当我尝试显示 XML 并且 xmlData 从未分配给任何东西时,我得到了一个空指针异常。我尝试放置一个等待它存储“错误”或 XML 文本的 while 循环,但从未分配过该变量。我将XML文件保存在我项目的war目录中,似乎可以找到该文件。我在网上搜索了类似的示例,但一切似乎都比我尝试做的要复杂一些,而且我不确定是否需要 servlet 或为此更改配置,或者文件是否是太大而无法读入字符串。任何帮助表示赞赏。谢谢。

【问题讨论】:

【参考方案1】:

在客户端(在浏览器中)解析 xml 非常慢,应该避免;将此委托给服务器端通常更快,因此对用户更友好(大文件会导致您的浏览器长时间停止响应)。

但是决定权在你;)这是我用来读取文件的方法:

定义这个辅助方法:

public static void httpGetFile(final String url, final AsyncCallback<String> callback) 
    final RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, url);
    rb.setCallback(new RequestCallback() 
        public void onResponseReceived(Request request, Response response) 
            try 
                final int responseCode = response.getStatusCode() / 100;
                if (url.startsWith("file:/") || (responseCode == 2)) 
                    callback.onSuccess(response.getText());
                 else 
                    callback.onFailure(new IllegalStateException("HttpError#" + response.getStatusCode() + " - " + response.getStatusText()));
                
             catch (Throwable e) 
                callback.onFailure(e);
            
        

        public void onError(Request request, Throwable exception) 
            callback.onFailure(exception);
        
    );
    try 
        rb.send();
     catch (RequestException e) 
        callback.onFailure(e);
    

在您的代码中,它可能如下所示:

...
    httpGetFile(url, new AsyncCallback<String>() 
        public void onFailure(Throwable caught) 
            xmlData = "Error";
        

        public void onSuccess(String xmlText) 
            xmlData = xmlText;
        
    
....

【讨论】:

感谢帮助方法!我会确保我尝试一下 我试用了你的辅助方法,效果很好。我认为这意味着这些类型的服务器调用应该使用 AsyncCallback?再次感谢您的帮助,我真的很感激! 不,使用AsyncCallback不是强制的,但是这个接口非常适合这样的使用。您当然可以设计方法来使用不同的方法,例如区分各种失败案例 - 但在我的应用程序中它没有意义 好像我在火狐上编译运行的时候,得到的响应是0。网上看,好像是因为我在做跨站请求。我将如何避免这种情况? 对于 json,有一个解决方法 - 请参阅 code.google.com/webtoolkit/doc/1.6/tutorial/Xsite.html 的“发出跨站点请求”;恐怕对于 xml 和任何其他格式,唯一的选择是在服务器端发出请求

以上是关于使用 GWT 读取一个非常大的本地 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用NPOI读取Excel数据到DataTable

如何将文件从小程序发送到 gwt 服务器?

PHP XMLReader 读取、编辑节点、编写 XMLWriter

gwt - servlet 路径 + url

在 java 中解析非常大的 XML 文档(以及更多)

为啥使用 php 从一个非常大的 csv 文件中只读取 1000 条记录?