XMLのようなテキストをjavascriptオブジェクトに解析する方法

私はこれを行う関数を作成しました。

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

テキストをループする方法はわかりません。開始タグと終了タグの処理方法  好きな

[tag] [tag]value[/tag] [/tag]

I thought to find starting tag from left and ending tag from the
right using indexOf('[tag]') and
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
を使用する良い理由がない限り、使用しないでください
JSONはこれらの問題のすべてを非常にうまく処理し、サーバからクライアントへ、そしてその逆も非常に簡単に浮かべることができます。

しかし、これは楽しいように見えるので、私は答えを拾うことができるかどうか試してみるでしょう。


Since your structure resembles XML, just replace the brackets
with < and > and parse it like
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); 
}

xml は、解析できる
DOMDocument を保持します:

xml.getElementsByTagName('person').childnodes;

この可能性のあるコードを試してみてください(テストしませんでした):

function createObject(element) {
  var object = {};

  if (element.childNodes.length > 0) {
    for (child in element.childnodes) {
      object[element.tagName] = createObject(child);
    }

    return object;
  } else {
    return element.nodeValue;
  }
}

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です