【问题标题】:Jquery suddenly stopped parsing xmljquery突然停止解析xml
【发布时间】:2017-08-12 08:12:07
【问题描述】:

对于某些浏览器,对于某些客户端,jquery突然停止解析xml。

示例 xml:

<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:example_namespace="https://mylink.com/wfs/example_namespace" xsi:schemaLocation="https://mylink.com/wfs/example_namespace mylink.com?SERVICE=WFS&amp;VERSION=1.0.0&amp;TYPENAME=example_namespace:TABLE&amp;REQUEST=DescribeFeatureType" numberMatched="unknown" numberReturned="1">
<gml:featureMember>
<example_namespace:TABLE fid="TABLE.15">
<example_namespace:ID>15</example_namespace:ID>
</example_namespace:TABLE>
</gml:featureMember>
</wfs:FeatureCollection>

示例 jquery

$.get(link, function(data) { //Response is xml like in example.
console.log(data) //works as before
console.log($(data).find("featureMember").find("ID").text())
//Doesn't work now for some clients, but worked before.
})

编辑:

更一般的例子:

XML

<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:c="http://www.example.com">
<c:b>TEST</c:b>
</a>

和 JS:

console.log($(data).find("b").text())

现在返回:“”,之前返回:“TEST”

编辑 2:

类似的问题: Cannot extract SOAP XML with jQuery

此代码上周最初在 Chrome 中运行,曾经在 Chrome 中运行 更新到 v60 它不再这样做了。

【问题讨论】:

标签: javascript jquery xml


【解决方案1】:

data 传递给$.parseXML() 以获得#document,使用.querySelector()

$.parseXML(data).querySelector("featureMember").querySelector("ID").textContent;

或者将$.parseXML() 的结果传递给jQuery() 并使用.find()

$($.parseXML(data)).find("featureMember").find("ID").text();

jsfiddle https://jsfiddle.net/5fuLquth/

【讨论】:

  • 为什么$.parseXML(data) if "console.log(data) //像以前一样工作" ?
  • @Andreas "//works as before" 是什么意思? jQuery() 不返回 #document 以调用 .find()jQuery() 返回一个包含 DOM 元素集合的 jQuery 对象。 $.parseXML() 返回 #document
  • 如果内容类型设置正确,则返回#documentjsfiddle.net/datLxfot
  • works as before 意味着“console.log(data)”返回解析后的 XML,就像更新 chrome 之前一样。
  • @Andreas “它”指的是什么? jQuery() 不返回 #document
【解决方案2】:

我认为以这种方式使用 jQuery 解析 XML 存在一些浏览器兼容性错误。这是以前的won't fix jquery bug

当xml中有namespaces时,您可以通过转义冒号来使用jquery选择器,如下所示:

.find('gml\\:featureMember')

或使用nodeName:

.find('[nodeName="gml:featureMember"]')

请看下面的演示:

var xml=`<?xml version="1.0" encoding="UTF-8"?><wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:example_namespace="https://mylink.com/wfs/example_namespace" xsi:schemaLocation="https://mylink.com/wfs/example_namespace mylink.com?SERVICE=WFS&amp;VERSION=1.0.0&amp;TYPENAME=example_namespace:TABLE&amp;REQUEST=DescribeFeatureType" numberMatched="unknown" numberReturned="1"><gml:featureMember><example_namespace:TABLE fid="TABLE.15"><example_namespace:ID>15</example_namespace:ID></example_namespace:TABLE></gml:featureMember></wfs:FeatureCollection>`;

console.log($(xml)
  .find('gml\\:featureMember')
  .find("example_namespace\\:ID").text());
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 不,不是,缺少文件声明&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  • 不知道命名空间怎么办?是否可以仅使用标签制作 .find() (像以前一样)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多