【问题标题】:Parsing XML with namespaces using jQuery $().find使用 jQuery $().find 解析带有命名空间的 XML
【发布时间】:2010-09-12 19:36:06
【问题描述】:

我正在尝试获取 XML 文档元素的内容,但该元素的名称中有一个冒号。

此行适用于所有元素,但名称中带有冒号的元素除外:

$(this).find("geo:lat").text();

我认为冒号需要转义。我该如何解决这个问题?

【问题讨论】:

    标签: javascript jquery xml namespaces


    【解决方案1】:

    使用反斜杠,它本身应该被转义,这样 JavaScript 就不会吃掉它:

    $(this).find("geo\\:lat").text();
    

    【讨论】:

    • @Vaske,我在使用最新版本的 jQuery 之一的 Chrome 中看到了同样的事情。在冒号后使用节点名称的后半部分对我有用。使用.find("lat") 而不是.find("geo\\:lat"),它对我有用。
    • @Mike 是的,这有帮助,但我遇到了命名空间问题,我返回的 XML 的一般问题是它包含 和 <title> 和 chrome 在这种情况下将它放在一起:(
    • 它在 FF 中对我不起作用,但我找到了这个答案:stackoverflow.com/questions/853740/…
    • .find 就像 getElementsByTagName 在浏览器(尤其是 Chrome 和 Firefox)之间的行为不同。如果您对直接子代感兴趣,请使用.children,它可以跨浏览器工作。更多信息:wiki.orbeon.com/forms/doc/contributor-guide/…
    • 我在相关问题的答案中引用了@MikeGrace 的评论:stackoverflow.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 });
      猜你喜欢
      • 2014-01-30
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2012-04-28
      • 2012-06-09
      • 2014-07-28
      • 2021-10-24
      相关资源
      最近更新 更多