我有一个变量字符串,其中包含格式良好且有效的XML。我需要使用JavaScript代码来解析这个提要。

我如何使用(浏览器兼容的)JavaScript代码来实现这一点?


当前回答

你也可以通过jquery的函数($.parseXML)来操作xml字符串

示例javascript:

var xmlString = '<languages><language name="c"></language><language name="php"></language></languages>';
var xmlDoc = $.parseXML(xmlString);
$(xmlDoc).find('name').each(function(){
    console.log('name:'+$(this).attr('name'))
})

其他回答

显然jQuery现在提供jQuery。parseXML http://api.jquery.com/jQuery.parseXML/ 从版本1.5开始

jQuery。parseXML(数据) 返回: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.

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") + "'"
    );
}

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);

更新:关于更正确的答案,请参阅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,并测试是否所有内容都按预期解析。