使用 jQuery $().find 解析带有命名空间的 XML
Posted
技术标签:
【中文标题】使用 jQuery $().find 解析带有命名空间的 XML【英文标题】:Parsing XML with namespaces using jQuery $().find 【发布时间】:2010-09-12 19:36:06 【问题描述】:我正在尝试获取 XML 文档元素的内容,但该元素的名称中有一个冒号。
此行适用于所有元素,但名称中带有冒号的元素除外:
$(this).find("geo:lat").text();
我认为冒号需要转义。我该如何解决这个问题?
【问题讨论】:
【参考方案1】:使用反斜杠,它本身应该被转义,这样 javascript 就不会吃掉它:
$(this).find("geo\\:lat").text();
【讨论】:
@Vaske,我在使用最新版本的 jQuery 之一的 Chrome 中看到了同样的事情。在冒号后使用节点名称的后半部分对我有用。使用.find("lat")
而不是.find("geo\\:lat")
,它对我有用。
@Mike 是的,这有帮助,但我遇到了命名空间问题,我返回的 XML 的一般问题是它包含 .find
就像 getElementsByTagName
在浏览器(尤其是 Chrome 和 Firefox)之间的行为不同。如果您对直接子代感兴趣,请使用.children
,它可以跨浏览器工作。更多信息:wiki.orbeon.com/forms/doc/contributor-guide/…
我在相关问题的答案中引用了@MikeGrace 的评论:***.com/a/30040350/775359【参考方案2】:
这不仅仅是一个普通的元素名称。这是一个限定名称,这意味着它是一个专门引用命名空间中元素类型的名称。元素类型名称为“lat”,命名空间前缀为“geo”。
目前,jQuery 不能很好地处理命名空间,详情请参阅bug 155。
现在,作为一种解决方法,您应该能够仅使用本地名称选择这些元素:
$(this).find("lat").text();
如果必须区分具有相同本地名称的元素类型,则可以使用filter()
:
var NS = "http://example.com/whatever-the-namespace-is-for-geo";
$(this).find("lat").filter(function() return this.namespaceURI == NS; ).text();
编辑:我的错误,我的印象是补丁已经登陆。使用 Adam 对选择器的建议,如果您也需要命名空间,请使用 filter()
:
var NS = "http://example.com/whatever-the-namespace-is-for-geo";
$(this).find("geo\\:lat").filter(function() return this.namespaceURI == NS; ).text();
【讨论】:
【参考方案3】:如果你有 chrome 或 webkit 的 jquery 选择器问题没有选择它尝试
$(this).find('[nodeName=geo:lat]').text();
这种方式适用于所有浏览器
【讨论】:
值得注意的是,从 jQuery 1.7 开始,一些用于查找命名空间元素的变通方法存在问题。有关更多信息,请参阅这些链接:bugs.jquery.com/ticket/10377steveworkman.com/html5-2/javascript/2011/… 绝对建议查看 ArnisAndy 在上面的评论中提供的第二个链接。它胜过所有其他解决方案。 steveworkman 的链接真的很有帮助。这适用于我的 Chrome 和 FF:$(xData.responseXML).find("z\\:row, row").each(function() // Do stuff );
以上是关于使用 jQuery $().find 解析带有命名空间的 XML的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有 Mongoose 和 ES6 承诺的 Graphql 中的 find 来解析多条记录