我有一个变量字符串,其中包含格式良好且有效的XML。我需要使用JavaScript代码来解析这个提要。
我如何使用(浏览器兼容的)JavaScript代码来实现这一点?
我有一个变量字符串,其中包含格式良好且有效的XML。我需要使用JavaScript代码来解析这个提要。
我如何使用(浏览器兼容的)JavaScript代码来实现这一点?
当前回答
2017年最新答案
下面将在所有主要浏览器中将XML字符串解析为XML文档。除非你需要支持IE <= 8或一些晦涩的浏览器,否则你可以使用下面的函数:
function parseXml(xmlStr) {
return new window.DOMParser().parseFromString(xmlStr, "text/xml");
}
如果你需要支持IE <= 8,下面的方法就可以了:
var parseXml;
if (typeof window.DOMParser != "undefined") {
parseXml = function(xmlStr) {
return new window.DOMParser().parseFromString(xmlStr, "text/xml");
};
} else if (typeof window.ActiveXObject != "undefined" &&
new window.ActiveXObject("Microsoft.XMLDOM")) {
parseXml = function(xmlStr) {
var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(xmlStr);
return xmlDoc;
};
} else {
throw new Error("No XML parser found");
}
一旦有了通过parseXml获得的Document,就可以使用常用的DOM遍历方法/属性(如childNodes和getElementsByTagName())来获得所需的节点。
使用示例:
var xml = parseXml("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);
如果你使用的是jQuery,从1.5版开始你就可以使用它内置的parseXML()方法,该方法在功能上与上面的函数相同。
var xml = $.parseXML("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);
其他回答
2017年最新答案
下面将在所有主要浏览器中将XML字符串解析为XML文档。除非你需要支持IE <= 8或一些晦涩的浏览器,否则你可以使用下面的函数:
function parseXml(xmlStr) {
return new window.DOMParser().parseFromString(xmlStr, "text/xml");
}
如果你需要支持IE <= 8,下面的方法就可以了:
var parseXml;
if (typeof window.DOMParser != "undefined") {
parseXml = function(xmlStr) {
return new window.DOMParser().parseFromString(xmlStr, "text/xml");
};
} else if (typeof window.ActiveXObject != "undefined" &&
new window.ActiveXObject("Microsoft.XMLDOM")) {
parseXml = function(xmlStr) {
var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(xmlStr);
return xmlDoc;
};
} else {
throw new Error("No XML parser found");
}
一旦有了通过parseXml获得的Document,就可以使用常用的DOM遍历方法/属性(如childNodes和getElementsByTagName())来获得所需的节点。
使用示例:
var xml = parseXml("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);
如果你使用的是jQuery,从1.5版开始你就可以使用它内置的parseXML()方法,该方法在功能上与上面的函数相同。
var xml = $.parseXML("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);
请看看XML DOM解析器(W3Schools)。这是一个关于XML DOM解析的教程。实际的DOM解析器因浏览器而异,但DOM API是标准化的,并保持相同(或多或少)。
如果可以限制自己使用Firefox,也可以使用E4X。它相对来说更容易使用,并且从1.6版开始成为JavaScript的一部分。这里是一个小的使用示例…
//Using E4X
var xmlDoc=new XML();
xmlDoc.load("note.xml");
document.write(xmlDoc.body); //Note: 'body' is actually a tag in note.xml,
//but it can be accessed as if it were a regular property of xmlDoc.
web上的大多数示例(以及上面介绍的一些示例)演示了如何以浏览器兼容的方式从文件加载XML。这证明很容易,除了在谷歌Chrome不支持document.implementation.createDocument()方法的情况下。当使用Chrome时,为了将XML文件加载到XmlDocument对象中,您需要使用内置的XmlHttp对象,然后通过传递它的URI来加载文件。
在您的示例中,情况有所不同,因为您希望从字符串变量而不是URL加载XML。然而,对于这个要求,Chrome应该像Mozilla一样工作(或者我听说过),并支持parseFromString()方法。
下面是我使用的一个函数(它是我目前正在构建的浏览器兼容性库的一部分):
function LoadXMLString(xmlString)
{
// ObjectExists checks if the passed parameter is not null.
// isString (as the name suggests) checks if the type is a valid string.
if (ObjectExists(xmlString) && isString(xmlString))
{
var xDoc;
// The GetBrowserType function returns a 2-letter code representing
// ...the type of browser.
var bType = GetBrowserType();
switch(bType)
{
case "ie":
// This actually calls into a function that returns a DOMDocument
// on the basis of the MSXML version installed.
// Simplified here for illustration.
xDoc = new ActiveXObject("MSXML2.DOMDocument")
xDoc.async = false;
xDoc.loadXML(xmlString);
break;
default:
var dp = new DOMParser();
xDoc = dp.parseFromString(xmlString, "text/xml");
break;
}
return xDoc;
}
else
return null;
}
<script language="JavaScript">
function importXML()
{
if (document.implementation && document.implementation.createDocument)
{
xmlDoc = document.implementation.createDocument("", "", null);
xmlDoc.onload = createTable;
}
else if (window.ActiveXObject)
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.onreadystatechange = function () {
if (xmlDoc.readyState == 4) createTable()
};
}
else
{
alert('Your browser can\'t handle this script');
return;
}
xmlDoc.load("emperors.xml");
}
function createTable()
{
var theData="";
var x = xmlDoc.getElementsByTagName('emperor');
var newEl = document.createElement('TABLE');
newEl.setAttribute('cellPadding',3);
newEl.setAttribute('cellSpacing',0);
newEl.setAttribute('border',1);
var tmp = document.createElement('TBODY');
newEl.appendChild(tmp);
var row = document.createElement('TR');
for (j=0;j<x[0].childNodes.length;j++)
{
if (x[0].childNodes[j].nodeType != 1) continue;
var container = document.createElement('TH');
theData = document.createTextNode(x[0].childNodes[j].nodeName);
container.appendChild(theData);
row.appendChild(container);
}
tmp.appendChild(row);
for (i=0;i<x.length;i++)
{
var row = document.createElement('TR');
for (j=0;j<x[i].childNodes.length;j++)
{
if (x[i].childNodes[j].nodeType != 1) continue;
var container = document.createElement('TD');
var theData = document.createTextNode(x[i].childNodes[j].firstChild.nodeValue);
container.appendChild(theData);
row.appendChild(container);
}
tmp.appendChild(row);
}
document.getElementById('writeroot').appendChild(newEl);
}
</script>
</HEAD>
<BODY onLoad="javascript:importXML();">
<p id=writeroot> </p>
</BODY>
欲了解更多信息,请参阅http://www.easycodingclub.com/xml-parser-in-javascript/javascript-tutorials/
显然jQuery现在提供jQuery。parseXML http://api.jquery.com/jQuery.parseXML/ 从版本1.5开始
jQuery。parseXML(数据) 返回:XMLDocument