我有一个变量字符串,其中包含格式良好且有效的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;
}

其他回答

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

免责声明:我创建了快速xml解析器

我创建了快速XML解析器,将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对象。

在网上试试,CDN

你也可以通过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'))
})

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