XML 数据孤岛的解决方法

Workaround for xml data islands

本文关键字:解决 方法 孤岛 数据 XML      更新时间:2023-09-26

我最近继承了一个巨大的Web应用程序,它是JSP,Javascript和Java的组合。它仅适用于IE,因为它是使用xml数据岛和其他阻止在其他浏览器上顺利运行的东西进行编码的。一切都很好,直到几天后,Windows 7盒子为少数用户推出,其中IE9/10在应用程序中的某些javascript上遇到了问题。例如,以下数据岛是我的 html 页面中的一个代码段。

<xml id = "underlyingdata" ondatasetcomplete="window.dialogArguments.parent.repopulateDropDown(this, underlyingdd)">
</xml>
<xml id="termdata" ondatasetcomplete="window.dialogArguments.parent.repopulateDropDown(this, termdd)">
</xml>

在此页面上还有另一行代码

window.dialogArguments.parent.request(underlyingdata, "CONTRACT.LIST.WB", "PULP AND PAPER|" + instrumentdd.options[instrumentdd.selectedIndex].text);

调用如下函数

function request(xmldataisland, requestmethod, parameters
{       
    var screwcache=Math.round(Math.random()*10000);
    xmldataisland.value=null;
    xmldataisland.load("/webaccess/Request?sessionid=" + sessionid + "&request=" + requestmethod + "&parameters=" + parameters+"&screwcache="+screwcache);
}

这在IE9/10中失败,错误是"加载"不是"xmldataisland"对象上的有效方法(脚本438错误),而在IE 5到IE 8上工作正常。

我相信上述函数中的 xmldataisland 对象是 XMLDocument 类型。为什么加载方法会失败?对此有什么解决方法?我从许多来源读到并听到使用数据孤岛是一个糟糕的主意。在这种情况下,正确的选择是什么?

从IE10开始,不再支持XML数据岛 - 浏览器将它们解析为HTML。Mozilla开发者网络已经发表了一篇文章,它给出了XML数据孤岛的跨浏览器替代方案,即HTML5"数据块"。本文演示了如果省略 src 属性且 type 属性未指定可执行脚本类型,则可以将 <script> 元素用作数据块。还必须确保嵌入的 XML 内容不包含 </script> 标记。

来源:https://developer.mozilla.org/en/docs/Using_XML_Data_Islands_in_Mozilla

这是他们给出的 HTML 示例...

<!DOCTYPE html>
<html>
<head>
<title>XML Data Block Demo</title>
<!-- this is the data block which contains the XML data -->
<script id="purchase-order" type="application/xml">
<purchaseOrder xmlns="http://example.mozilla.org/PurchaseOrderML">
  <lineItem>
    <name>Line Item 1</name>
    <price>1.25</price>
  </lineItem>
  <lineItem>
    <name>Line Item 2</name>
    <price>2.48</price>
  </lineItem>
</purchaseOrder>
</script>
<script>
function runDemo() {
  // the raw XML data can be retrieved using this...
  var orderSource = document.getElementById("purchase-order").textContent; 
  // the XML data can be parsed into a DOM tree using the DOMParser API...
  var parser = new DOMParser();
  var doc = parser.parseFromString(orderSource, "application/xml");
  var lineItems = doc.getElementsByTagNameNS("http://example.mozilla.org/PurchaseOrderML", "lineItem");
  var firstPrice = lineItems[0].getElementsByTagNameNS("http://example.mozilla.org/PurchaseOrderML", "price")[0].textContent;
  document.body.textContent = "The purchase order contains " + lineItems.length + " line items. The price of the first line item is " + firstPrice + ".";
}
</script>
</head>
<body onload="runDemo()";>
Demo did not run
</body>
</html>

您需要编写自己的方法来将数据加载到该块中(可能使用 jQuery.get.load 方法)。

希望对您有所帮助!

给出接受的答案4.5年后,可以使用HTML5进行更新。脚本标记不是必需的。HTML5基于XML,允许您创建自己的标签名称。您可以为所有浏览器创建一个"xml岛",如下所示:

   <parms style="display:none;">
    <op>
       encrypt
    </op>
    <msg>
       Hello World!
    </msg>
  </parms>

并做这样的事情来使用它。

  var xml = document.querySelector("parms");
  var op = xml.querySelector("op").textContent;
  var msg = xml.querySelector("msg").textContent;

您还可以使用div (display:none) 作为使用 XHR 获取的 XML 的容器。由于HTML5基于XML,因此您可以使用MIME类型的text/XML从服务器返回XML,并使用.innerHTML将其放入div中。