将标记片段解析为Javascript数组

时间:2017-03-16 03:12:43

标签: javascript xml

我正在尝试使用Javascript解析XML片段并将结果放入数组中。我生活在PHP世界中,并且由于要求,这必须是Javascript,所以在解决方案上有点磕磕绊绊。我需要'variables'元素中所有'variable'属性的'name'和'value'值。使用下面的myVars变量,它实际上有更多的标记,它会返回一个像这样的关联数组:

array={fname:'Gene',lname:'Simmons'}; 

这是标记。

var myVars = '<variables><variable name="fname" type="string" value="Gene" resume="true"/><variable name="lname" type="string" value="Simmons" resume="true"/><variable name="LastSlideViewed" type="string" value="_player.3093j3" resume="true"/></variables><actiongroups><actiongroup id="ActGrpOnSubmitButtonClick"><actions><trigger_submit_slide/></actions></actiongroup><actiongroups>';

在一个完美的世界中,我能够排除某些具有某个“名称”值的“变量”元素。例如,排除其“名称”值在“排除”数组中的所有元素,例如:

var exclude = ["LastSlideViewed", "FirstSlideViewed"];

所以上面的数组只有fname和lname键的原因是因为我们只从'variables'元素中获取'variable'元素,并排除那些在exclude数组中找到'name'值的元素,并且我们也忽略了'variables'元素之外的任何东西,比如'actiongroups'元素。任何帮助将不胜感激。

我可能会越来越近了:

parser = new DOMParser();
xmlDoc = parser.parseFromString(myVars,"text/xml");

x = xmlDoc.getElementsByTagName('variable');
for (i = 0; i < x.length; i++) { 
    myAssociativeArr.push({name: x[i].getAttribute('name'), value: x[i].getAttribute('value')});
}

1 个答案:

答案 0 :(得分:0)

是的,你很亲密。 JavaScript不使用术语“关联数组”,但JavaScript中的对象与您称之为关联数组的对象非常相似。

我已修改您的代码以使用对象,并添加了if语句以省略排除的项目。这有效:

var myVars = '<variables><variable name="fname" type="string" value="Gene" resume="true"/><variable name="lname" type="string" value="Simmons" resume="true"/><variable name="LastSlideViewed" type="string" value="_player.3093j3" resume="true"/></variables><actiongroups><actiongroup id="ActGrpOnSubmitButtonClick"><actions><trigger_submit_slide/></actions></actiongroup><actiongroups>';

var exclude = ["LastSlideViewed", "FirstSlideViewed"];

var parser = new DOMParser();
var xmlDoc = parser.parseFromString(myVars, "text/xml");

var x = xmlDoc.getElementsByTagName('variable');
var myAssociativeArr = {};
for (var i = 0; i < x.length; i++) {
  var name = x[i].getAttribute('name');
  if (exclude.indexOf(name) === -1) {
    myAssociativeArr[name] = x[i].getAttribute('value');
  }
}

console.log(myAssociativeArr);

如果您确实想要使用类似于在代码中构建的对象数组,那么您可以将该部分恢复为您拥有它的方式:

var myVars = '<variables><variable name="fname" type="string" value="Gene" resume="true"/><variable name="lname" type="string" value="Simmons" resume="true"/><variable name="LastSlideViewed" type="string" value="_player.3093j3" resume="true"/></variables><actiongroups><actiongroup id="ActGrpOnSubmitButtonClick"><actions><trigger_submit_slide/></actions></actiongroup><actiongroups>';

var exclude = ["LastSlideViewed", "FirstSlideViewed"];

var parser = new DOMParser();
var xmlDoc = parser.parseFromString(myVars, "text/xml");

var x = xmlDoc.getElementsByTagName('variable');
var myAssociativeArr = [];
for (var i = 0; i < x.length; i++) {
  var name = x[i].getAttribute('name');
  if (exclude.indexOf(name) === -1) {
    myAssociativeArr.push({name: name, value: x[i].getAttribute('value')});
  }
}

console.log(myAssociativeArr);