Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将类似XML的文本解析为javascript对象_Javascript_Xml_Json_Parsing_Text Parsing - Fatal编程技术网

如何将类似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平面列表将是一个问题,但我认为我可以使用我过去编写的函数遍历树,使用递归深入到“多维数组”中,但我不知道它是否有效。