TL/DR:如何通过 FormPanel 加载 XML 响应可靠吗?
我们在 GWT 中有一个 Web 应用程序,其大部分 UI 使用 Sencha GXT。我们使用 GXT FormPanel将文件上传到服务器端脚本(它只是回显文件的内容)以在 JS 中获取本地文件的内容。最终这可以通过 FileReader 完成,但显然不能在不支持它的浏览器中完成。
FormPanel提交其表单并将结果加载到一个隐藏的 IFrame 中,使用以下代码片段(来自 FormPanelImpl.class)从中提取内容:
try {
// Make sure the iframe's window & document are loaded.
if (!iframe.contentWindow || !iframe.contentWindow.document)
return null;
// Get the body's entire inner HTML.
return iframe.contentWindow.document.body.innerHTML;
} catch (e) {
return null;
}
我们正在以这种方式加载 XML 文件,有问题的行是
return iframe.contentWindow.document.body.innerHTML;
因为在少数情况下 XML 是作为 XML 加载的(因此没有嵌入到 HTML 包装器中)。我尝试了以下方法:
Content-Type: text/html最初(在本地 PHP 测试脚本中的监督,我在生产代码中的部分错误)。在 Firefox 和 Chrome 中工作,但不在 IE (9) 中工作,在 IE (9) 中,XML 在 IFrame 中作为 XML 加载。Content-Type: application/xml这对于有效载荷来说是正确的。现在它在任何地方都不起作用,因为我们现在得到了最初只有 IE 在 Chrome 和 FF 中表现出来的行为。Content-Type: application/octet-stream : 这不是个好主意,它只是下载文件。Content-Type: text/plain : 我希望这会始终触发 HTML/body 包装,它确实会触发,但它也会将所有内容包装在 pre 中。元素所以它现在到处都失败了,但至少可靠。太好了。经过一番挖掘,我发现显然是 GXT FormPanel使用相同的 FormPanelImpl来自 GWT,因此两者的结果无论如何都是相同的。 GWT 的文档说(Sencha 明智地隐瞒了这一点):
The back-end server is expected to respond with a content-type of
'text/html', meaning that the text returned will be treated as HTML. If any other content-type is specified by the server, then the result html sent in theonFormSubmitevent will be unpredictable across browsers, and theFormHandler.onSubmitComplete(FormSubmitCompleteEvent)event may not fire at all.
但是,即使发送 text/html如果负载是 XML,则行为在浏览器中是不可预测的。
有通用的解决方案吗?还是我遗漏了一些非常微不足道的东西(我现在只看了 GWT 三天)?
编辑: 我尝试在 <html><body> 之前添加到文件内容,这样即使 IE 也会在 IFrame 中有一个正文。好吧,确实如此,但它也导致了一个非常非常奇怪的 innerHTML开始于:
<?XML:NAMESPACE PREFIX = [default] ...
XML 解析器可以理解地窒息。
最佳答案
我的猜测是,一般来说,将 XML 包装在 HTML 上下文中而不对特殊字符执行任何转义操作并不可靠。我希望它至少在像
这样的 XML 文档中失败<a>
<b>
<html>
</html>
</b>
</a>
我们采用的方法是只发回一个小的“OK”消息,然后使用一个单独的请求从服务器获取(缓存的)内容。
或者,它可能会执行 HTML 编码/解码(或 Base64,...)
关于xml - GWT 和 Sencha GXT : FormPanel result fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260450/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::
我正在遍历数组中的一组标签名称,我想使用构建器打印每个标签名称,而不是求助于“我认为:builder=Nokogiri::XML::Builder.newdo|xml|fortagintagsxml.tag!tag,somevalendend会这样做,但它只是创建名称为“tag”的标签,并将标签变量作为元素的文本值。有人可以帮忙吗?这个看起来应该比较简单,我刚刚在搜索引擎上找不到答案。我可能没有以正确的方式提问。 最佳答案 尝试以下操作。如果我没记错的话,我添加了一个根节点,因为Nokogiri需要一个。builder=Nokogi
这是一些奇怪的例子:#!/usr/bin/rubyrequire'rubygems'require'open-uri'require'nokogiri'print"withoutread:",Nokogiri(open('http://weblog.rubyonrails.org/')).class,"\n"print"withread:",Nokogiri(open('http://weblog.rubyonrails.org/').read).class,"\n"运行此返回:withoutread:Nokogiri::XML::Documentwithread:Nokogiri::
我正在尝试加载SAML协议(protocol)架构(具体来说:https://www.oasis-open.org/committees/download.php/3407/oasis-sstc-saml-schema-protocol-1.1.xsd),但在执行此操作之后:schema=Nokogiri::XML::Schema(File.read('saml11_schema.xsd'))我得到这个输出:Nokogiri::XML::SyntaxErrorException:Element'{http://www.w3.org/2001/XMLSchema}element',att
我正在尝试通过POST将XML内容发送到一个简单的Rails项目中的Controller(“解析”)方法(“索引”)。它不是RESTful,因为我的模型名称不同,比如“汽车”。我在有效的功能测试中有以下内容:deftest_index...data_file_path=File.dirname(__FILE__)+'/../../app/views/layouts/index.xml.erb'message=ERB.new(File.read(data_file_path))xml_result=message.result(binding)doc=REXML::Document.ne
我有这样的代码:@doc=Nokogiri::HTML(open(url)@doc.xpath(query).eachdo|html|putshtml#howgetcontentofanodeend我如何获取节点的内容而不是像这样: 最佳答案 这是READMEfile中的概要示例为Nokogiri展示了一种使用CSS、XPath或混合的方法:require'nokogiri'require'open-uri'#GetaNokogiri::HTML:Documentforthepagewe’reinterestedin...doc=N
恐怕我没有太多通过网络服务器发布文档(例如XML)的经验,所以如果我对HTTP的理解不足,我深表歉意。我在127.0.0.1上的ruby应用程序中设置了一个基本的MongrelWeb服务器端口2000.(服务器)。我在同一台计算机上运行一个单独的Ruby应用程序。(客户)。我需要客户端向服务器发送XML文档。我曾尝试使用Net::HTTP来执行此操作,但我找不到一个明确的示例来告诉我应该做什么。我试过了,但遇到了错误。我已将请求分解,使其尽可能基本:http=Net::HTTP.new("127.0.0.1",2000)http.post('file','query=foo')#x
我们有RoR应用程序,我们计划在新版本中制作js接口(interface)(extjs或闭包)。是否可以将GWT与RoR一起使用? 最佳答案 是的,将GWT与RoR结合使用是完全可能的。客户端服务器通信将通过JSON,RoR可以轻松生成。当您使用HTML/JavaScript/CSS创建客户端应用程序时,GWT最有效,如果您想要逐步增强现有的HTMLUI,jQuery等可能是更好的选择。 关于ruby-on-rails-GWT和RubyonRails,我们在StackOverflow上找
我有一些XML文档,我想从Sinatra服务器获取这些文档。我做了一些搜索,但找不到任何具体的东西。我确实找到了构建器gem,但我不想从头开始构建文档。我试着做这样的事情get'/'xml='Myname90'bodyxmlend但这会在它周围添加HTML标签。这可能是我所缺少的非常基本的东西。你能给我指出正确的方向吗? 最佳答案 这对于Sinatra来说非常简单:get'/'docontent_type'text/xml'"Luis99"end在获取“/”时,响应将是XML"Luis99"使用正确的content_type。