我有一个变量字符串,其中包含格式良好且有效的XML。我需要使用JavaScript代码来解析这个提要。
我如何使用(浏览器兼容的)JavaScript代码来实现这一点?
我有一个变量字符串,其中包含格式良好且有效的XML。我需要使用JavaScript代码来解析这个提要。
我如何使用(浏览器兼容的)JavaScript代码来实现这一点?
当前回答
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;
}
其他回答
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.
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") + "'"
);
}
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;
}
在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);
}
}
}
}