Dav*_*ici 200 javascript xml parsing
我有一个包含格式良好且有效的XML 的变量字符串.我需要使用JavaScript代码来解析此Feed.
如何使用(浏览器兼容的)JavaScript代码完成此操作?
Tim*_*own 320
更新了2017年的答案
以下内容将XML字符串解析为所有主流浏览器中的XML文档.除非您需要支持IE <= 8或某些不起眼的浏览器,否则您可以使用以下功能:
function parseXml(xmlStr) {
return new window.DOMParser().parseFromString(xmlStr, "text/xml");
}
Run Code Online (Sandbox Code Playgroud)
如果您需要支持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");
}
Run Code Online (Sandbox Code Playgroud)
一旦你有一个Document通过获得的parseXml,你可以使用通常的DOM遍历方法/属性,如childNodes和getElementsByTagName()得到你想要的节点.
用法示例:
var xml = parseXml("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);
Run Code Online (Sandbox Code Playgroud)
如果您使用的是jQuery,那么从版本1.5开始,您可以使用其内置parseXML()方法,该方法在功能上与上述功能相同.
var xml = $.parseXML("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);
Run Code Online (Sandbox Code Playgroud)
San*_*uys 90
更新:有关更正确的答案,请参阅Tim Down的回答.
例如,Internet Explorer和基于Mozilla的浏览器为XML解析提供了不同的对象,因此使用像jQuery这样的JavaScript框架来处理跨浏览器的差异是明智的.
一个非常基本的例子是:
var xml = "<music><album>Beethoven</album></music>";
var result = $(xml).find("album").text();
Run Code Online (Sandbox Code Playgroud)
注:正如评论中指出的那样; jQuery并没有真正做任何XML解析,它依赖于DOM innerHTML方法,并且会解析它就像任何HTML一样,因此在XML中使用HTML元素名称时要小心.但我认为它对于简单的XML"解析"非常有用,但是它可能不建议用于密集或"动态"XML解析,在这种情况下,您不需要预先知道XML将会发生什么,并且测试是否所有内容都按预期进行解析.
Cer*_*rus 19
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;
}
Run Code Online (Sandbox Code Playgroud)
小智 13
Marknote是一个很好的轻量级跨浏览器JavaScript XML解析器.它是面向对象的,它有很多例子,而且还记录了API.这是相当新的,但到目前为止,它在我的一个项目中运作良好.我喜欢它的一件事是它将直接从字符串或URL读取XML,您也可以使用它将XML转换为JSON.
以下是Marknote可以做的一个例子:
var str = '<books>' +
' <book title="A Tale of Two Cities"/>' +
' <book title="1984"/>' +
'</books>';
var parser = new marknote.Parser();
var doc = parser.parse(str);
var bookEls = doc.getRootElement().getChildElements();
for (var i=0; i<bookEls.length; i++) {
var bookEl = bookEls[i];
// alerts "Element name is 'book' and book title is '...'"
alert("Element name is '" + bookEl.getName() +
"' and book title is '" +
bookEl.getAttributeValue("title") + "'"
);
}
Run Code Online (Sandbox Code Playgroud)
我总是使用下面的方法在IE和Firefox中运行.
示例XML:
<fruits>
<fruit name="Apple" colour="Green" />
<fruit name="Banana" colour="Yellow" />
</fruits>
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然jQuery现在提供jQuery.parseXML http://api.jquery.com/jQuery.parseXML/ 从版本1.5开始
jQuery.parseXML( data )
返回: XMLDocument
| 归档时间: |
|
| 查看次数: |
227023 次 |
| 最近记录: |