龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

在Ajax开发中如何恰当使用XML(1)(2)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
将名/值对转化成 XML 如果希望这样使用 XML 作为数据格式,首先要做的是找到一种基本 XML 格式来存储数据。显然,名/值对可以全部转化成 XML 元素,以其
将名/值对转化成 XML

如果希望这样使用 XML 作为数据格式,首先要做的是找到一种基本 XML 格式来存储数据。显然,名/值对可以全部转化成 XML 元素,以其中的名称作为元素名,值作为元素的内容:

Larry
Gullahorn
9018 Heatherhorn Drive
Rowlett
Texas
75080

当然,XML 要求有一个根元素;如果使用文档片段(XML 文档的一部分)的话则需要一个封闭元素。因此可能需要将上述 XML 转化成下面的形式:

Larry Gullahorn 9018 Heatherhorn Drive Rowlett Texas 75080

现在基本上可以准备在 Web 客户机上创建这种结构并发送到服务器了。

通信,口头上的

在网络上传输 XML 之前,需要保证服务器以及发送数据的脚本能够接受 XML。现在对很多人来说这么强调似乎有点多余,认为这是理所当然的,但是很多新手往往认为只要通过网络发送 XML,就能够被正确地接收和解释。

实际上,需要两个步骤来保证发送的 XML 的数据能够被正确地接收:

  1. 保证向其发送 XML 的脚本能够接受 XML 数据格式。
  2. 保证脚本认可发送数据所采用的特定 XML 格式和结构。

这两方面都可能要求您进行人际沟通,必须明确地告知对方!严格地说,如果确实需要发送 XML 数据,多数脚本作者都会帮助您,因此寻找能够接受 XML 的脚本应该不难。但是,仍然需要保证格式是脚本所希望的格式。比方说,假设服务器接受下列格式的数据:


  Larry
  Gullahorn
  9018 Heatherhorn Drive
  Rowlett
  Texas
  75080

看起来和上面的 XML 类似,只有两点不同:

  1. 来自客户机的 XML 封装在 address 元素,但是服务器要求数据封装在 profile 元素中。
  2. 来自客户机的 XML 使用了 zipCode 元素,而服务器希望邮政编码放在 zip-code 元素中。

从大的层面上来说,这些小问题仅仅是服务器接收和处理数据的区别,但是服务器会彻底失败,在网页上(可能向其用户)显示意义含糊的错误消息。因此必须明确服务器的期望的格式,并把要发送的数据塞进那种格式。然后,只有在这时才会涉及到从客户机向服务器发送 XML 数据的真正的技术问题。

向服务器发送 XML

当向服务器发送 XML 的时候,更多的代码用于获取数据和包装成 XML,而不是真正的传输数据。实际上,只要准备好发送到服务器的 XML 字符串,发送工作就和普通文本一样了,如清单 2所示。

清单 2. 用 XML 发送名/值对

function callServer() {
  // Get the city and state from the Web form
  var firstName = document.getElementById("firstName").value;
  var lastName = document.getElementById("lastName").value;
  var street = document.getElementById("street").value;
  var city = document.getElementById("city").value;
  var state = document.getElementById("state").value;
  var zipCode = document.getElementById("zipCode").value;

  var xmlString = "" +
    "  " + escape(firstName) + "" +
    "  " + escape(lastName) + "" +
    "  " + escape(street) + "" +
    "  " + escape(city) + "" +
    "  " + escape(state) + "" +
    "  " + escape(zipCode) + "" +
    "";

  // Build the URL to connect to
  var url = "/scripts/saveAddress.php";

  // Open a connection to the server
  xmlHttp.open("POST", url, true);

  // Tell the server you're sending it XML
  xmlHttp.setRequestHeader("Content-Type", "text/xml");

  // Set up a function for the server to run when it's done
  xmlHttp.onreadystatechange = confirmUpdate;

  // Send the request
  xmlHttp.send(xmlString);
}

大部分代码都很简单,只有少数地方值得提一下。首先,请求中的数据必须手工格式化为 XML。阅读了三篇关于使用文档对象类型的文章之后,再来讨论它是不是很简单了?虽然不禁止在 JavaScript 中使用 DOM 创建 XML 文档,但是在通过 GET 或 POST 请求发送到网络上之前必须将 DOM 对象转化成文本。因此使用常规字符串操作来格式化数据更简单一些。当然,这样很容易出现错误和误输入,因此在编写处理 XML 的代码时必须非常小心。

建立 XML 之后,按照和发送文本基本相同的方式打开连接。对于 XML 最好使用 POST 请求,因为有些浏览器限制了 GET 请求字符串的长度,而 XML 可能很长,可以看到清单 2中把 GET 改成了 POST 方法。此外,XML 通过 send() 方法发送,而不是附加在请求 URL 最后的参数。这些都是非常细微的区别,很容易修改。

但是必须编写一行新的代码:

xmlHttp.setRequestHeader("Content-Type", "text/xml");

看起来很难理解,它只不过是告诉服务器要发送的是 XML 而不是一般的名/值对。无论哪种情况,发送的数据都是文本,但这里使用 text/xml 或者 XML 作为普通文本发送。如果使用名/值对,对应的行应该是:

xmlHttp.setRequestHeader("Content-Type", "text/plain");

如果忘记告诉服务器发送的是 XML,就会出现问题,因此不要忘掉这一步骤。

完成这些之后,剩下的就是调用 send() 并传入 XML 字符串了。服务器将收到您的 XML 请求,并(假设已经做好了准备工作)接受 XML,解释它,然后返回响应。实际上要做的只有这么多 ―― XML 请求只需要稍微修改代码。

发送 XML:好还是不好?

在结束 XML 响应的 XML 请求(以及本文)之前,我们花点时间讨论一下在请求中使用 XML 的感受。前面已经提到,就传输而言 XML 完全不是最快的方式,但是还有更多因素要考虑。

构造 XML 不是简单的事情

首先必须认识到,对于请求来说构造 XML 不是简单的事。如清单 2所示,数据很快就会和 XML 语义纠缠在一起:

var xmlString = "" +
  "  " + escape(firstName) + "" +
  "  " + escape(lastName) + "" +
  "  " + escape(street) + "" +
  "  " + escape(city) + "" +
  "  " + escape(state) + "" +
  "  " + escape(zipCode) + "" +
  "";

似乎还不坏,但是要知道这是只有六个字段的 XML 片段。开发的多数 Web 表单都有十到十五个字段,虽然不一定所有的请求都使用 Ajax,但是应该考虑这种情况。至少要花和实际数据同样多的时间来处理尖括号和标签名称,有可能使本来很少的输入变得非常大。

这里的另一个问题前面已经提到,即必须手工创建 XML。使用 DOM 不是一种好的选择,因为没有简单易行的办法将 DOM 对象转化成在请求中发送的字符串。因此像这样使用字符串处理是最好的办法,不过也是一种维护起来最困难和新开发人员最难理解的方法。在这个例子中,所有 XML 都在一行中构造完成,如果分为多步只会更加混乱。

XML 没有为请求增加任何东西

除了复杂性的问题之外,和普通文本以及名/值对相比,在请求中使用 XML 实际上没有多少好处(如果有的话)。要注意,本文坚持使用前面用名/值对发送的同一些数据来用 XML 发送。我没有提什么数据能用 XML 但是不能用普通文本发送,这是因为实际上没有任何东西可用 XML 而不能用普通文本发送。

事实上这就是 XML 和请求的底线:不是一定非要这么做不可。在本系列的下一期文章中将看到服务器可以使用 XML 实现普通文本很难做到的一些事情,但请求不属于这种情况。因此除非和只接受 XML 的脚本(确实存在这样的脚本)打交道,在请求中最好使用普通文本。

结束语

通过本文,您现在可能已经开始对 Ajax 中的 XML 有一些更深的理解了。您知道 Ajax 应用程序不一定要使用 XML,XML 也不是数据传输中的什么法宝。还知道从网页向服务器发送 XML 不是多么难的事情。更重要的是,您知道为了确保服务器能够处理和响应请求需要做什么:必须保证服务器脚本接受 XML,而且能够识别用于发送数据的格式。

您还应该非常清楚 XML 对于请求来说并不一定是很好的数据格式。在以后的文章中,您将看到 XML 在某些情况下是有利的,但在多数请求中,它只会降低速度和增加复杂性。因此虽然通常我都会建议您马上应用在文章中学到的内容,但是对本文来说,我建议您在应用这里学到的知识时最好三思而后行。XML 请求在 Ajax 应用程序中有自己的价值,但是并不像您所想象的那么大。

在《如何在Ajax请求和响应中使用XML》文中,我们讨论服务器如何使用 XML 做出响应,以及 Web 应用程序如何处理这些响应。令人高兴的是,服务器能够将 XML 发送回 Web 应用程序,这样做的理由比较充分,因此那篇文章中的技术细节更实用,目前您只需要知道 XML 为何并非一定是最佳选择――至少对发送请求而言。您可以尝试使用 XML 作为请求数据格式实现某些 Web 应用程序,然后再换回普通文本,看看哪种办法更快更简单。

推荐:《如何在Ajax请求和响应中使用XML》

(责任编辑:铭铭 mingming_ky#126.com TEL:(010)-68476636)


精彩图集

赞助商链接