如何将类似XML的文本解析为javascript对象
我创建了一个函数来实现这一点如何将类似XML的文本解析为javascript对象,javascript,xml,json,parsing,text-parsing,Javascript,Xml,Json,Parsing,Text Parsing,我创建了一个函数来实现这一点 var text="adsf [name]Victor[/name] dummytext [name]Elliot[/name] asdf [name]Jake[/name] asdf [foo]bar[/foo]"; alert( readTags(text,'name') ); //Victor,Elliot,Jake alert( readTags(text,'foo') ); //bar 但现在我想实现一个函数,它接收如下字符串 [person]
var text="adsf [name]Victor[/name] dummytext [name]Elliot[/name] asdf [name]Jake[/name] asdf [foo]bar[/foo]";
alert( readTags(text,'name') ); //Victor,Elliot,Jake
alert( readTags(text,'foo') ); //bar
但现在我想实现一个函数,它接收如下字符串
[person]
[name]jake[/name]
[age]12[/age]
[/person]
var object={};
object['person']={};
object['name']='jake';
object['age']='12';
return(object);
返回一个像这样的对象
[person]
[name]jake[/name]
[age]12[/age]
[/person]
var object={};
object['person']={};
object['name']='jake';
object['age']='12';
return(object);
但我不知道如何循环阅读课文。如何处理开始和结束标记?
像
我想用indexOf('[tag]')
和lastindexOf('[/tag]')从左边找到起始标记,从右边找到结束标记。
但在这种情况下不起作用
[tag]value[/tag] [tag]value[/tag]
这是前面的函数
function readTags(str,property){
var beginTag='['+property+']';
var endTag='[/'+property+']';
var values=new Array(0);
while(str.indexOf(beginTag)!=-1){
values[values.length]=strBetween(str,beginTag,endTag);
str=str.substring(str.indexOf(endTag)+endTag.length);
}
return(values);
}
function strBetween(string,strBegin,strEnd){ //StrBetween("abcdef","b","e") //return "cd"
var posBegin, posEnd;
posBegin=string.indexOf(strBegin);
string=string.substring(posBegin + strBegin.length);
posEnd=string.indexOf(strEnd);
string=string.substring(0,posEnd);
if ((posBegin==-1)||(posEnd==-1)){
return(null);
}else{
return(string);
}
}
除非你有充分的理由不使用,否则不要这样做。JSON可以很好地处理所有这些问题,并且可以很容易地在服务器和客户端之间浮动,反之亦然 但既然这看起来很有趣,我会试试看是否能想出一个答案
由于您的结构类似于XML,只需将括号替换为
,并像XML一样解析它:
text = text.replace('[', '<').replace(']', '>');
if (typeof DOMParser != "undefined") {
var parser = new DOMParser();
var xml = parser.parseFromString(text, 'text/xml');
} else {
var xml = new ActiveXObject('Microsoft.XMLDOM');
xml.async = 'false';
xml.loadXML(text);
}
尝试此可能工作的代码(未测试):
除非你有充分的理由不使用,否则不要这样做。JSON可以很好地处理所有这些问题,并且可以很容易地在服务器和客户端之间浮动,反之亦然 但既然这看起来很有趣,我会试试看是否能想出一个答案
由于您的结构类似于XML,只需将括号替换为
,并像XML一样解析它:
text = text.replace('[', '<').replace(']', '>');
if (typeof DOMParser != "undefined") {
var parser = new DOMParser();
var xml = parser.parseFromString(text, 'text/xml');
} else {
var xml = new ActiveXObject('Microsoft.XMLDOM');
xml.async = 'false';
xml.loadXML(text);
}
尝试此可能工作的代码(未测试):
我认为如果没有第三方解析器,这会很有趣,所以我构建了一个简单的解析器:
function parse(code)
{
var obj = {},
cur = obj,
stack = [];
code.replace(/\[([^\]]+)\]|([^\[]*)/g, function (match, tagName, text) {
if (tagName)
{
if (tagName.charAt(0) == "/")
{
/* end tag */
cur = stack.pop();
}
else
{
/* start tag */
stack.push(cur);
cur = cur[tagName] = {};
}
}
else
{
cur["#text"] = text;
}
});
return obj;
}
var obj = parse(text);
我认为如果没有第三方解析器,这会很有趣,所以我构建了一个简单的解析器:
function parse(code)
{
var obj = {},
cur = obj,
stack = [];
code.replace(/\[([^\]]+)\]|([^\[]*)/g, function (match, tagName, text) {
if (tagName)
{
if (tagName.charAt(0) == "/")
{
/* end tag */
cur = stack.pop();
}
else
{
/* start tag */
stack.push(cur);
cur = cur[tagName] = {};
}
}
else
{
cur["#text"] = text;
}
});
return obj;
}
var obj = parse(text);
JSON XML不要这样做。改为使用。@PointedEars我正在使用博客来承载像这样的机器人可以抓取的内容,几乎所有这些内容都会向JSON添加垃圾,或者不允许XML或tagsDon这样做。改为使用。@PointedEars我正在使用博客来承载像这样的机器人可以抓取的内容,几乎所有这些内容都会向JSON添加垃圾,或者不允许使用XML或tagssmart解决方案!是跨浏览器的?现在我想我可以使用
getElementsByTagName(“*”)
循环所有元素并生成一个对象。我说得对吗?if
的第二部分处理IE,这在任何情况下都是一个问题。至于第二部分,当然可以。我个人会坚持使用childnodes
和tagName
进行迭代。它将简化您的任务。(实际上,这是我的下一个想法)不要在这里使用窗口
;如果必须,请使用this
,但如果(DOMParser!=“undefined”)更好。用var
声明文本
,解析器
,xml
等变量。返回一个NodeList
,因此必须是getElementsByTagName(“person”)[0]
。必须是childNodes
(区分大小写)。到目前为止,DOMParser是非常跨浏览器的。对于IE/MSHTML,您有第二个分支;但需要启用ActiveX支持。传递“*”将返回所有元素的节点列表。但这将是平面的,因此您无法从中构建对象。你需要穿过这棵树。E4X可以在这里提供帮助。@PointedEars:谢谢你的提示。我包括了我能做的。@PointedEars平面列表将是一个问题,但我认为我可以使用我过去编写的函数遍历树,使用递归深入到“多维数组”,但我不知道它是否有效。聪明的解决方案!是跨浏览器的?现在我想我可以使用getElementsByTagName(“*”)
循环所有元素并生成一个对象。我说得对吗?if
的第二部分处理IE,这在任何情况下都是一个问题。至于第二部分,当然可以。我个人会坚持使用childnodes
和tagName
进行迭代。它将简化您的任务。(实际上,这是我的下一个想法)不要在这里使用窗口
;如果必须,请使用this
,但如果(DOMParser!=“undefined”)更好。用var
声明文本
,解析器
,xml
等变量。返回一个NodeList
,因此必须是getElementsByTagName(“person”)[0]
。必须是childNodes
(区分大小写)。到目前为止,DOMParser是非常跨浏览器的。对于IE/MSHTML,您有第二个分支;但需要启用ActiveX支持。传递“*”将返回所有元素的节点列表。但这将是平面的,因此您无法从中构建对象。你需要穿过这棵树。E4X可以在这里提供帮助。@PointedEars:谢谢你的提示。我包括了我所能做的。@PointedEars平面列表将是一个问题,但我认为我可以使用我过去编写的函数遍历树,使用递归深入到“多维数组”中,但我不知道它是否有效。