JavaScript中变量字符串的XML解析

JavaScript中变量字符串的XML解析,javascript,xml,parsing,Javascript,Xml,Parsing,我有一个变量字符串,它包含格式良好且有效的XML。我需要使用JavaScript代码来解析这个提要 如何使用(与浏览器兼容的)JavaScript代码完成此操作?请查看()。这是一个关于XML DOM解析的教程。实际的DOM解析器因浏览器而异,但DOM API是标准化的,并保持不变(或多或少) 如果可以的话,也可以使用Firefox。相对来说,它更易于使用,而且自1.6版以来,它是JavaScript的一部分。下面是一个小示例用法 //Using E4X var xmlDoc=new XML()

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

如何使用(与浏览器兼容的)JavaScript代码完成此操作?

请查看()。这是一个关于XML DOM解析的教程。实际的DOM解析器因浏览器而异,但DOM API是标准化的,并保持不变(或多或少)

如果可以的话,也可以使用Firefox。相对来说,它更易于使用,而且自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.

更新:有关更正确的答案,请参阅

Internet Explorer和基于Mozilla的浏览器为XML解析公开了不同的对象,因此明智的做法是使用JavaScript框架来处理跨浏览器的差异

一个非常基本的例子是:

var xml = "<music><album>Beethoven</album></music>";

var result = $(xml).find("album").text();
var xml=“贝多芬”;
var result=$(xml).find(“相册”).text();
注:如评论中所述;jQuery实际上并不做任何XML解析,它依赖于DOM innerHTML方法,并将像解析任何HTML一样解析它,因此在XML中使用HTML元素名称时要小心。但我认为它对于简单的XML“解析”非常有效,但对于密集的或“动态”XML解析,可能不建议使用它,因为在这种情况下,您不需要预先知道XML将出现什么,并且这将测试是否所有内容都按预期进行解析。

web上的大多数示例(以及上面介绍的一些示例)演示如何以浏览器兼容的方式从文件加载XML。这证明很容易,除了Google Chrome不支持
document.implementation.createDocument()
方法之外。使用Chrome时,为了将XML文件加载到XmlDocument对象中,需要使用内置的XmlHttp对象,然后通过传递其URI来加载文件

在您的例子中,情况有所不同,因为您希望从字符串变量而不是URL加载XML。然而,对于这个需求,Chrome应该和Mozilla(或者我听说过)一样工作,并且支持parseFromString()方法

下面是我使用的一个函数(它是我当前正在构建的浏览器兼容性库的一部分):

函数加载xmlString(xmlString)
{
//ObjectExists检查传递的参数是否为null。
//isString(顾名思义)检查类型是否为有效字符串。
if(ObjectExists(xmlString)和&isString(xmlString))
{
var-xDoc;
//GetBrowserType函数返回一个两个字母的代码,表示
//…浏览器的类型。
var bType=GetBrowserType();
开关(B型)
{
案例“ie”:
//这实际上调用了一个返回DOMDocument的函数
//基于安装的MSXML版本。
//此处简化以供说明。
xDoc=新的ActiveXObject(“MSXML2.DOMDocument”)
xDoc.async=false;
loadXML(xmlString);
打破
违约:
var dp=新的DOMParser();
xDoc=dp.parseFromString(xmlString,“text/xml”);
打破
}
返回xDoc;
}
其他的
返回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);
      }
    }
  }
}
函数getFruits(xml){ var fruits=xml.getElementsByTagName(“fruits”)[0]; 如果(水果){ var fruitsNodes=fruits.childNodes; if(果穗){ 对于(变量i=0;i显然,jQuery现在提供jQuery.parseXML 从1.5版开始

jQuery.parseXML(数据)

返回:
XMLDocument

2017年更新答案

以下内容将在所有主要浏览器中将XML字符串解析为XML文档。除非您需要对IE的支持,否则它是一个很好的轻量级跨浏览器JavaScript XML解析器。它是面向对象的,并且有大量的示例,另外还有文档记录。这是相当新的,但到目前为止,它在我的一个项目中工作得很好。我喜欢它的一点是,它将直接从字符串或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") + "'"
    );
}
var str=''+
'  ' +
'  ' +
'';
var parser=new marknote.parser();
var doc=parser.parse(str);
var bookEls=doc.getRootElement().getChildElements();
对于(变量i=0;i

函数importXML()
{
if(document.implementation&&document.implementation.createDocument)
{
xmlDoc=document.implementation.createDocument(“,”,null);
xmlDoc.onload=createTable;
}
else if(window.ActiveXObject)
{
xmlDoc=新的ActiveXObject(“Microsoft.XMLDOM”);
xmlDoc.onreadystatechange=函数(){
如果(xmlDoc.readyState==4)createTable()
};
}
其他的
{
警报(“您的浏览器无法处理此脚本”);
返回;
}
load(“periors.xml”);
}
函数createTable()
{
var theData=“”;
var x=xmlDoc.getElementsByTagName(“皇帝”);
var newEl=document.createElement('TABLE');
newEl.setAttribute('cellPadding',3);
newEl.setAttribute('cellSpacing',0);
newEl.setAttribute('border',1);
var tmp=document.createElement('TBODY');
新儿童(tmp);
var行=document.createElement('TR');

对于(j=0;j,您还可以通过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'))
})
var xmlString='';
var xmlDoc=$.parseXML(xmlString);
$(xmlDoc).find('name').each(函数(){
console.log('name:'+$(this.attr('name'))
})

免责声明:我已经创建了

我有
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'))
})
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);