Answers:
更新:有关更正确的答案,请参见Tim Down的答案。
Internet Explorer和基于Mozilla的浏览器为XML解析提供了不同的对象,因此明智的是使用jQuery之类的JavaScript框架来处理跨浏览器的差异。
一个非常基本的示例是:
var xml = "<music><album>Beethoven</album></music>";
var result = $(xml).find("album").text();
注意:如评论中所指出;jQuery实际上并没有执行任何XML解析,它依赖于DOM innerHTML方法,并且将像解析任何HTML一样解析它,因此在XML中使用HTML元素名称时要格外小心。但是我认为它对于简单的XML“解析”效果相当好,但是对于密集或“动态”的XML解析,可能不建议您这样做,因为您不需要预先了解XML会下降什么,并且可以测试是否按预期进行解析。
innerHTML
元素的属性,这根本不可靠。
jQuery()
]解析HTML,不是 XML”
更新了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
获得了via parseXml
,就可以使用常规的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解析。请更仔细地阅读注释:在许多情况下,它根本不起作用。
parseXML()
方法使用字符串。我对更改答案有些谨慎,因为我现在没有简单的方法可以对其进行测试。
网络上的大多数示例(以及上面提供的一些示例)都显示了如何以浏览器兼容方式从文件加载XML 。事实证明这很容易,但不支持该document.implementation.createDocument()
方法的Google Chrome浏览器除外。使用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;
}
if(window.ActiveXObject){...}
var dp; try{ dp = new DOMParser() } catch(e) { }; if(dp) { // DOMParser supported } else { // alert('you need to consider upgrading your browser\nOr pay extra money so developer can support the old versions using browser sniffing (eww)') }
。
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") + "'"
);
}
我一直使用下面的方法在IE和Firefox中起作用。
XML示例:
<fruits>
<fruit name="Apple" colour="Green" />
<fruit name="Banana" colour="Yellow" />
</fruits>
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);
}
}
}
}
innerText
而不是getAttribute()
显然,jQuery 从1.5版本开始提供了jQuery.parseXML http://api.jquery.com/jQuery.parseXML/
jQuery.parseXML( data )
返回值: XMLDocument
请看一下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.
<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/
免责声明:我已经创建了fast-xml-parser
我创建了fast-xml-parser来将XML字符串解析为JS / JSON对象或中间遍历对象。它有望与所有浏览器兼容(但是仅在Chrome,Firefox和IE上进行了测试)。
用法
var options = { //default
attrPrefix : "@_",
attrNodeName: false,
textNodeName : "#text",
ignoreNonTextNodeAttr : true,
ignoreTextNodeAttr : true,
ignoreNameSpace : true,
ignoreRootElement : false,
textNodeConversion : true,
textAttrConversion : false,
arrayMode : false
};
if(parser.validate(xmlData)){//optional
var jsonObj = parser.parse(xmlData, options);
}
//Intermediate obj
var tObj = parser.getTraversalObj(xmlData,options);
:
var jsonObj = parser.convertToJson(tObj);
注意:它不使用DOM解析器,而是使用RE解析字符串并将其转换为JS / JSON对象。