使用 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 的一般问题是它包含 和 <title> 和 chrome 在这种情况下将它放在一起:( 它在 FF 中对我不起作用,但我找到了这个答案:***.com/questions/853740/… .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 来解析多条记录

Jquery的$命名冲突详细解析

无法使用 DOM 解析器读取带有命名空间前缀的 xml

jQuery选择带有命名空间元素的选择器

如何使用 JQuery 解析带有名称空间的 xml(并且适用于所有浏览器 ..)?

带有自定义命名空间的jQuery应用程序