【问题标题】:AJAX library that supports namespaced xml支持命名空间 xml 的 AJAX 库
【发布时间】:2012-01-13 09:42:22
【问题描述】:

我正在寻找一个支持命名空间 xml 的 AJAX JavaScript 库。

我在网上阅读了几十篇文章(包括在 stackoverflow 上),但没有找到好的答案。有很多 AJAX 示例,但是一旦命名空间开始发挥作用,它们就会中断(例如 jQuery 选择器就是这种情况)。

【问题讨论】:

  • 你能提供一些例子吗?
  • 呃...打破的例子?使用 jQuery:$(responseXML).find("foo:bar")
  • $("nspace\\:data", xml).find("foo\\:bar").each(function(i) {stackoverflow.com/questions/853740/…
  • 不,恐怕这是因为特殊情况而发生的一个技巧,但现在已经被最近的 jQuery 版本(v 1.7)打破了。

标签: javascript xml ajax namespaces


【解决方案1】:

我不知道您所称的“AJAX JavaScript 库”究竟是什么——发出 HTTP 请求是一个问题与访问文档树中的节点不同

如果您将库理解为“用于开发软件的资源集合”(Wikipedia),那么,作为 JSX 库的一部分,我为 @987654328 编写了相当兼容的¹包装器@ 和命名空间感知 DOM Level 3 XPath: http.jsxpath.js

http.js同样支持同步和异步处理,甚至可以访问本地文件系统(如果授权的话)。因为 JSX 可以作为一个库,所以你可以单独使用 http.jsxpath.js,用外来代码补充其中一个,或者一起使用。

您可以一起使用它们,例如,如下所示。假设您有一个资源名称为 test.xml 的 XML 文档,例如

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Body>
    <res:Response
        xmlns:res="http://domain.example/Response">
      <res:OUTPUT>
        <res:UNDO_COUNT>1.0</res:UNDO_COUNT>
        <res:MSG>Undo complete (No more to undo)</res:MSG>
      </res:OUTPUT>
    </res:Response>
    <res:OUTPUT
        xmlns:res="http://domain.example/Response">
      foo
    </res:OUTPUT>
  </soap:Body>
</soap:Envelope>

如果你想从它的res:UNDO_COUNT 元素中提取1.0,你可以这样写:

<!-- 1. Include prerequisites and dependencies using Resource Builder (recommended) -->
<script type="text/javascript" src="builder.php?src=object,string,http,xpath"></script>

<script type="text/javascript">
  /*
   * 2. Construct the HTTP request wrapper; 
   *    the default is a GET request with asynchronous handling
   */
  var request = new jsx.net.http.Request("test.xml");

  /* 3. Prepare processing of the HTTP response */
  request.setSuccessListener(function (response) {
    /* 5. Get the reference to the XMLDocument object */
    var doc = response.responseXML;

    /* 6. Create the namespace resolver that fits your query best */
    var nsResolver = jsx.xpath.createFullNSResolver(null, doc);

    /* 7. Make the XPath query */
    var nodes = jsx.xpath.evaluate("//res:UNDO_COUNT/text()", doc, nsResolver);

    /*
     * 8. Process the result.  jsx.xpath.evaluate() returns a reference
     * to an Array instance if you do not specify the result type.
     */

    /* "1.0" */
    console.log(nodes[0].data);
  });

  /* 4. Make the HTTP request */
  request.send();
</script>

另见:Parsing XML / RSS from URL using Java Script

¹ JSX:object.jshttp.jsxpath.js 的组合已在 Gecko、WebCore、MSHTML 和 Opera 浏览器中测试为阳性。然而,JSX 目前主要是实验性代码。

Testcase,见脚本控制台

欢迎提供建设性反馈。另外,JSX 是free software。 (你还不能创建checkout,但我正在努力。)

【讨论】:

  • 我对请求和响应处理都感兴趣(我的主要问题是后者)。谢谢你的回复,我去看看你的包装。您是否在 Internet Explorer 7/8/9 中对其进行了测试?至于最后一个链接,恐怕一旦命名空间发挥作用,就没有什么相关的了。
  • 我无法在 IE 7 到 9 中测试 xpath.js 的 HEAD 版本(今天提交)。我在 Wine 上的 IE 6.0.2800.1106 中对其进行了正面测试,因此支持 MSXML 的 selectNodes,并且我不希望在以后的 IE 版本(相同的 DOM)中出现意外。至于发出 HTTP 请求,请查看 JSX:http.js(请参阅编辑)。这已经在指定的浏览器中进行了测试,至少包括 IE 7 和 8,并且正在为商业网站提供动力(当然,这些网站运行的是稍旧的 JSX 修订版)。
  • @Christophe 你是什么意思 - 无关紧要? RSS/XML 使用命名空间。您需要一个名称空间解析器来使用 XPath 查找这些元素。我之前的帖子展示了如何制作和使用一个。 jsx.xpath.create…NSResolver() 以此为基础。
  • 抱歉,我需要仔细看看。我刚刚看到了 getElementsByTagName 的使用,只要涉及到命名空间就会中断。
  • @Christophe 我更新了描述并将两个示例合并为一个用例,以便您更好地了解脚本如何协同工作。
猜你喜欢
  • 2010-09-19
  • 2021-11-09
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2012-09-26
  • 1970-01-01
相关资源
最近更新 更多