我正在尝试使用 jQuery 来解析内存中的 XML 文档。这在除 IE(令人震惊的)以外的所有方面都很好用。一些谷歌搜索显示问题很可能是由于 IE 将我的文档视为 HTML 而不是 XML MIME 类型。
有没有办法让我的 jQuery 实现正常工作,或者我是否必须检查客户端浏览器并实现 IE 特定的 XML 解析?
谢谢!!
function getQAData(xmlData) {
var dataArr = new Array();
$(xmlData).find('item').each(function() {
dataArr.push({ questionid: $(this).attr("cellID"), answer: $(this).find('answer').text() });
});
return dataArr; // this array is nice and populated in everything but ie
XML 示例
<hwroot>
<data pid="">
<item cellID="24_951">
<question>Are you there?</question>
<answer>No</answer>
</item>
<item cellID="24_957">
<question>A Question?</question>
<answer>blah blah blah</answer>
</item>
</data>
</hwroot>
解决方案:
由于下面@treeface 所述的原因,我的 jQuery .find() 解决方案将不起作用。这是我的解决方案:
基于导航器的分支JS代码:(
if (browserName == "Microsoft Internet Explorer") {
MsXmlParse(xmlData, dataArr);
} else {
$(xmlData).find('item').each(function() {
dataArr.push({ questionid: $(this).attr("cellID"), answer: $(this).find('answer').text() });
});
}
MsXmlParse的定义
function MsXmlParse(xmlDocument, qarray) {
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.async = "false";
xmldoc.loadXML(xmlDocument);
var itemElements = xmldoc.getElementsByTagName("item");
for (var i = 0; i < itemElements.length; i++) {
var questionCellID = itemElements[i].getAttributeNode("cellID").nodeValue;
var answerTxt = itemElements[i].childNodes[1].text;
qarray.push({ questionid: questionCellID, answer: answerTxt });
}
}//结束msxmlparse
最佳答案
正如您在此处看到的那样,我对此没有任何问题:
http://jsfiddle.net/treeface/VuwcH/
我的猜测是,在 IE 中,您首先没有正确解析 XML 数据,但除非您向我们展示该 xmlData 变量的输出,否则无法判断。正如您在我的示例中看到的,您需要使用 DOMParser 以外的其他内容。对象以便在 IE 中正确解析 XML 字符串。你必须这样做:
xmlData = new ActiveXObject("Microsoft.XMLDOM");
xmlData.async = "false";
xmlData.loadXML(text); //where text is your XML string
编辑:
好的,这里的问题也是你的 xmlData对象是一串XML?您在您的帖子中提到它是“内存中的 XML 文档”,在这种情况下,它可以并且确实可以在 IE 中运行。据我从您的回复中可以看出,xmlData 实际上是一个字符串,这就是问题所在。 IE 是唯一在将不兼容的 HTML 放入 HTML 节点时遇到问题的主要浏览器。由于 jQuery 的 XML 解析器将提供的字符串包装在 div 中, 它在 IE 中崩溃了。 jQuery 认识到了这个错误,他们认为这是一个“无法修复”的问题。
问题在这里:http://bugs.jquery.com/ticket/3143
未修复的原因:检查此链接:http://api.jquery.com/jQuery#jQuery2 jQuery 构造函数只支持 html,不支持 xml。该字符串被刷新到一个 div 中,这可能是 IE 崩溃的原因。因为该字符串不是有效的 html。
特别是这一点:
When the HTML is more complex than a single tag without attributes, as it is in the above example, the actual creation of the elements is handled by the browser's
innerHTMLmechanism. In most cases, jQuery creates a new<div>element and sets theinnerHTMLproperty of the element to the HTML snippet that was passed in. When the parameter has a single tag, such as$('<img/>')or$('<a></a>'), jQuery creates the element using the native JavaScriptcreateElement()function.When passing in complex HTML, some browsers may not generate a DOM that exactly replicates the HTML source provided. For example, Internet Explorer prior to version 8 will convert all href properties on links to absolute URLs, and Internet Explorer prior to version 9 will not correctly handle HTML5 elements without the addition of a separate compatibility layer.
所以我怀疑他们“不会修复”它,否则所有其他浏览器都会变得草率。我不确定这个答案的准确性(或他们决定背后的逻辑质量),但事实就是如此。
所以...简而言之(为时已晚?)...不,没有简单的方法可以在一行中处理这个问题。话又说回来,也没有什么可以阻止您使用 JSON 而不是 XML。
关于javascript - jQuery Find() 和 XML 在 IE 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4998324/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
这段代码似乎创建了一个范围从a到z的数组,但我不明白*的作用。有人可以解释一下吗?[*"a".."z"] 最佳答案 它叫做splatoperator.SplattinganLvalueAmaximumofonelvaluemaybesplattedinwhichcaseitisassignedanArrayconsistingoftheremainingrvaluesthatlackcorrespondinglvalues.Iftherightmostlvalueissplattedthenitconsumesallrvaluesw
你能解释一下吗?我想评估来自两个不同来源的值和计算。一个消息来源为我提供了以下信息(以编程方式):'a=2'第二个来源给了我这个表达式来评估:'a+3'这个有效:a=2eval'a+3'这也有效:eval'a=2;a+3'但我真正需要的是这个,但它不起作用:eval'a=2'eval'a+3'我想了解其中的区别,以及如何使最后一个选项起作用。感谢您的帮助。 最佳答案 您可以创建一个Binding,并将相同的绑定(bind)与每个eval相关联调用:1.9.3p194:008>b=binding=>#1.9.3p194:009>eva
我无法运行Spring。这是错误日志。myid-no-MacBook-Pro:myid$spring/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/lib/spring/sid.rb:17:in`fiddle_func':uninitializedconstantSpring::SID::DL(NameError)from/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/li
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
我想禁用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::