我有一个包含格式良好且有效的XML 的变量字符串.我需要使用JavaScript代码来解析此Feed.
如何使用(浏览器兼容的)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");
}
一旦你有一个Document
通过获得的parseXml
,你可以使用通常的DOM遍历方法/属性,如childNodes
和getElementsByTagName()
得到你想要的节点.
用法示例:
var xml = parseXml("Stuff ");
alert(xml.documentElement.nodeName);
如果您使用的是jQuery,那么从版本1.5开始,您可以使用其内置parseXML()
方法,该方法在功能上与上述功能相同.
var xml = $.parseXML("Stuff ");
alert(xml.documentElement.nodeName);
更新:有关更正确的答案,请参阅Tim Down的回答.
例如,Internet Explorer和基于Mozilla的浏览器为XML解析提供了不同的对象,因此使用像jQuery这样的JavaScript框架来处理跨浏览器的差异是明智的.
一个非常基本的例子是:
var xml = ""; var result = $(xml).find("album").text(); Beethoven
注:正如评论中指出的那样; jQuery并没有真正做任何XML解析,它依赖于DOM innerHTML方法,并且会解析它就像任何HTML一样,因此在XML中使用HTML元素名称时要小心.但我认为它对于简单的XML"解析"非常有用,但是它可能不建议用于密集或"动态"XML解析,在这种情况下,您不需要预先知道XML将会发生什么,并且测试是否所有内容都按预期进行解析.
Web上的大多数示例(以及上面介绍的一些示例)显示了如何以浏览器兼容的方式从文件加载XML .这证明很简单,除了Google 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;
}
Marknote是一个很好的轻量级跨浏览器JavaScript XML解析器.它是面向对象的,它有很多例子,而且还记录了API.这是相当新的,但到目前为止,它在我的一个项目中运作良好.我喜欢它的一件事是它将直接从字符串或URL读取XML,您也可以使用它将XML转换为JSON.
以下是Marknote可以做的一个例子:
var str = '' + ' '; var parser = new marknote.Parser(); var doc = parser.parse(str); var bookEls = doc.getRootElement().getChildElements(); for (var i=0; i' + ' ' + '
5> John Topley..:我总是使用下面的方法在IE和Firefox中运行.
示例XML:
JavaScript的:
function getFruits(xml) { var fruits = xml.getElementsByTagName("fruits")[0]; if (fruits) { var fruitsNodes = fruits.childNodes; if (fruitsNodes) { for (var i = 0; i < fruitsNodes.length; i++) { var name = fruitsNodes[i].getAttribute("name"); var colour = fruitsNodes[i].getAttribute("colour"); alert("Fruit " + name + " is coloured " + colour); } } } }
6> Jamie Pate..:显然jQuery现在提供jQuery.parseXML http://api.jquery.com/jQuery.parseXML/ 从版本1.5开始
jQuery.parseXML( data )
返回:XMLDocument