目前只能给100,就先给100吧。解决了之后另有重谢。
好了,首先,我们看一个XML文件
<?xml version="1.0" encoding="utf-8" ?>
<data>
<tagxml_0>
<o_id>4</o_id>
         <tname>systemore</tname>
<tfiled>o_id,sys_name,sys_masrk</tfiled>
                  <t_pid>-1</t_pid>
</tagxml_0>
<tagxml_1>
<o_id>9</o_id>
<tname>systemoreson</tname>
<tfiled>o_id,field_name,field_type,field_length,field_value,field_masrk</tfiled>
<t_pid>4</t_pid>
</tagxml_1>
<Setdescription>
<table_countsforxml>2</table_countsforxml>
</Setdescription>
</data>
嗯,现在正式开始说明:xml的tagxml_0这样的节点是动态读取出来的,不知道有多少个。 tagxml_0是主对象,没有父级对象。  而像tagxml_1......tagxml_N这样的是会存在着父级对象,区分它的父级对象是以t_pid这个标签区分的,t_pid如果对象节点o_id则说明,当前存在父级关系。我现在开始解析这个xml.我将解析好的xml以这样的格式存到了一个数组中。
par[0]....par[n]  其中每个数组元素如:par[0],它的值是一个键值对,如当前xml解析出来的则为par[0]={o_id:4,tname:"systemore",tfiled:"o_id,sys_name,sys_masrk",t_pid:-1},这样的一个键值对,依次类推。直到把tagxml_0...tagxml_N这样的节点解析完毕,<Setdescription>
<table_countsforxml>2</table_countsforxml>
</Setdescription> 这段节点是我用来解析XML而生成的,大家不用关心,现在只关心我最终解析出来的键值对数组就行了。解析好XML成为键值对数组后,我现在需要生成一个对象。具体这个对象该实例化成什么样,就是我要请求大神们的了,我着手写了一点,不过觉得不满意。而且还没表达出关系来,先看看我的对象。假设我解析好的xml数组为dllparvar sss = new newobj(dllpar);
function newobj(dllpar) {
    eval("this." + dllpar[0].tname + "=new function() {var x = String(dllpar[0].tfiled).split(',');for (var i = 0; i < x.length; i++) {eval('this.' + x[i] + '=null');}}");
    eval("this." + dllpar[1].tname + "=new function() {var x = String(dllpar[1].tfiled).split(',');for (var i = 0; i < x.length; i++) {eval('this.' + x[i] + '=null');}}");
}以这样的方式我new出来的对象sss对象具备了这样一些属性。sss.systemore.o_id,sss.systemore.sys_name,sss.systemore.sys_masrk。同时具备第二个sss.systemoreson.这里就是xml里面的tfiled标签里的所有属性,同第一个一样。但是现在的结构我还没表达出来他们的关系。嗯,大概就是这样。我要的最终结构是:var obj =new newobj(参数给解析好的xml)。然后得到的对象obj具有如下的良好表达:
1.准确的表达出每个标签里的tname有那些属性(tfiled里的以,分割的就是它的属性。)
2。准确的表达出每个属性之间的对应关系。如obj.systemoreson属于obj.systemore.
3.也是最难的一点,我这个对象了除了第一节对象,其他可能最终使用时需要让它编程一个数组形式。如obj.systemoreson[0].o_id  而obj.systemoreson[1].o_id 这样的如果我赋值成多个,也要让它同时具备obj.systemoreson的所有属性。嗯,大概先这些,有不明白的地方,大神们尽管提出,解决之后有重谢。在线等!!!

解决方案 »

  1.   

    如此XML,是从哪里传过来的,太复杂了,也许会有更好的方式,你的意思是:
    <tagxml_0>中systemore是<tagxml_1><tagxml_2>.....<tagxml_n>的父节点。你要生成一个对象,既包含了父节点中所有属性<tfiled>o_id,sys_name,sys_masrk</tfiled>,又包含了子节点<tfiled>中的属性??????????
      

  2.   

    是不是要这样的?
    <script type="text/javascript">
    var par = [
    {o_id:4,tname:"systemore",tfiled:"o_id,sys_name,sys_masrk",t_pid:-1},
    {o_id:9,tname:"systemoreson",tfiled:"o_id,field_name,field_type,field_length,field_value,field_masrk",t_pid:4 },
    {o_id:10,tname:"systemoreson",tfiled:"o_id,field_name,field_type,field_length,field_value,field_masrk",t_pid:4 }
    ];function parseObject(arr){
    var i, j, fields, p, obj;
    for(i = 0; i < arr.length; i++){
    p = arr[i].tname;
    fields = arr[i].tfiled.split(',');
    if(arr[i].t_pid === -1){ 
    this.o_id = arr[i].o_id;
    this[p] = {};
    for(j = 0; j < fields.length; j++){
    this[p][fields[j]] = null;
    }
    }else if(arr[i].t_pid === this.o_id){
    obj = {};
    for(j = 0; j < fields.length; j++){
    obj[fields[j]] = null;
    }
    obj.o_id = arr[i].o_id;
    if(!this[p]){
    this[p] = [];
    }
    this[p].push(obj);
    }
    }
    }var obj = new parseObject(par);
    alert(obj.systemoreson.length);
    alert(obj.systemoreson[1].o_id);
    </script>
      

  3.   

    嗯,那我就再简化点。就用几个变量来说明吧。
    var a = {x0:1,x1:"sysa",x2:"o1,o2,o3,o4",x3:-1}
    var b = {x0:2,x1:"sysb",x2:"p1,p2,p3,p4",x3:1}
    这个2个键值对,也就是我说的xml里的tagxml_0和tagxml_1里这样的数据,目前我用2个说明问题。
    通过数组我把它组合成一个数组。然后丢给一个函数,
    par[0]=a
    par[1]=b
    var obj = new kk(par);
    然后我要通过new方法来得到一个对象obj。这个对象要清楚的描述出属性之间的关系。
    obj基本的基本属性  o.sysa.o1,o.sysa.o2,o.sysa.o3,o.sysa.o4
                     o.sysb.p1,o.sysb.p2,o.sysb.p3,o.sysb.p4
    obj每个属性里要有特殊属性来表名它的关系。 如o.sysa.父对象=null   o.sysb.父对象=o.sysa这个对象我是用来存储数据的,除了根对象外,其他的对象要具备数组方式访问,数组也要同时具备当前属性的基本属性。如:
    o.sysb[0].p1 ............o.sysb[n].p1function kk(par){
    ......
    }
      

  4.   

    但是并没有这种 this.o_id = arr[i].o_id;
    因为this.???这个是动态从xml读取的,并不是直接就知道的。所以我前面有了
    eval("this."+arr[i].o_id+"=arr[i].o_id")这种方法来生成。
      

  5.   

    你肯定是想构成这么一个对象,然后存储在一个表中吧。?????xml中既然有父节点和子节点,为何不把信息存储在一个主表和一个字表中呢,
    用json表示xml,
    然后就可以轻松的存储到数据库中了
      

  6.   

    超级同意,lz只要给出xml内容,然后告诉大家,你想实现什么就行了,,,,
    备注:你告诉大家用js来构造对象,这绝对会先入为主,误导大家的,,,
      

  7.   


    这个XML就是从表里读取出来的。我要将这个结构生成为一个对象,方便我随时操作,取值。
      

  8.   

    xml我给出来了。我要实现的是。第一节相当于是主表。
    然后后面的每节点为子表。
    <tfiled>o_id,field_name,field_type,field_length,field_value,field_masrk</tfiled>
    这里的内容为表的字段名
    <tname>systemore</tname>
    这个标签里为表的名称。我需要生成一个对象obj.表名.字段名    除去主表,子表可能会一对多。那么这个对象就会存在
    obj.子表名[0].字段名........obj.子表名[n].字段名
    原型都会只存在一个子表,如果我页面增加多条数据,那么我这个对象的子表肯定就是多个,我要随心所遇来操作这个对象。并且通过<t_pid>-1</t_pid>
    知道当前的  obj.子表名   属于那个表.
      

  9.   

    json就可以实现你想要的对象:json数据实例:
    { systemmore:{"o_id":"",sys_name:"","sys_masrk":""},
      sons:[ {son1:[{"o_id":"",}]},  {son2:[]}]
    }
      

  10.   

    再简化点,通过XML的数据描述。写一个函数出来,通过new方法,我要得到新的对象,要详细的对XML数据进行描述。var  obj  = new func(xml);对象生成出来,我通过OBJ.xxx.xxx.xxx的格式,我随时可以获得xml对象的关系,新new的对象obj,我要描述出XML所有的关系,
    obj.主表名.字段名 obj.主表名.字段名1 ....obj.主表名.字段名n
    obj.子表名.字段名 obj.子表名.字段名1 ....obj.子表名.字段名n
    obj.孙表名.字段名 obj.孙表名.字段名1 ....obj.孙表名.字段名n
    obj.孙表名1.字段名 obj.孙表名1.字段名1 ....obj.孙表名1.字段名n
    并且描述关系  
                  obj.主表名.父表名=null
                  obj.子表名.父表名=主表名
                  obj.孙表名.父表名=子表名。
                  obj.孙表名1.父表名=子表名。
    这样够清楚吗?通过new生成出来的对象要详细的描述出xml文件。
      

  11.   


    我就是说明问题的,如果有更好的方式表达,请教大神们了。用js的对象来表达xml的描述。
      

  12.   

    <tagxml_0>
    <o_id>4</o_id>
    <tname>systemore</tname>
    <tfiled>o_id,sys_name,sys_masrk</tfiled>
      <t_pid>-1</t_pid>
    </tagxml_0>
    这样理解:<data>相当于一个数据表,tagxml_0相当于其中一条数据,o_id,tname,tfiled,t_pid相当于这条数据表的4个字段。通过o_id,t_pid来判断这一条数据是否为父级或父级数据(类似于多级菜单),tname相当于这条数据的标识,tfiled相当于这条数据的类容(要获取的属性)。然后要把这些N条数据归类(其实只需要tagxml_0就可,不需要tagxml_1....tagxml_n),通过new方法,得到新的对象,要详细的对XML数据进行描述。如果这样理解,方法就很简单了。
      

  13.   

    var a = {x0:1,x1:"sysa",x2:"o1,o2,o3,o4",x3:-1}
    var b = {x0:2,x1:"sysb",x2:"p1,p2,p3,p4",x3:1}
    var c = {x0:3,x1:"sysc",x2:"n1,n2,n3,n4",x3:1}
    先判断出父级数据,再获取其子数据sysa[1]=o1;sysa[2]=o2;sysa[3]=o3;sysa[3]=o3
    sysa.sysb[1]=p1;sysa.sysb[2]=p2;sysa.sysb[3]=p3;sysa.sysb[4]=p4
    sysa.sysc[1]=n1;sysa.sysc[2]=n2;sysa.sysc[3]=n3;sysa.sysc[4]=n4是这样理解吗?
      

  14.   

    嗯,是要取出这些数据,取这些数据不难。关键是生成的类要详细的对它进行描述。关系,另外除了顶级的sysa,后面的sysb数据来了的时候是需要用成数组方式的。
      

  15.   

    16楼说的我正在考虑,应该肯定会用到原型,因为如果数据需要存储到新new的对象时,这个对象除了第一节的sysa为单一情况,后面的sysb.....sysn都会存在多数据的情况。
      

  16.   

    我觉得可以考虑原型。
    http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
      

  17.   

    csdn的分太不值钱了。一个问题给1K分
      

  18.   

    算是最后一问吧。我要让JS的数组元素去以某个键值对为原型该怎么做,简单就是像C#的dataset。
    比如dataset名字为ds里有N个表。可以这样ds.tables[0].rows
    ds.tables[1].rows
    ds.tables[n].rows  这样每个数组都拥有rows的属性,简单来说我这个大概是需要用到这个方法,而且我这个实际大概的意思就是 在前台生成一个js对象,它跟c#的dataset对象差不多。
      

  19.   

    差不多吧。我想在前台生成一个类似.net的dataset对象的对象
      

  20.   

    LZ想法有问题!光看这句描述吧
    ==========================obj.孙表名.字段名=================
    对象的方法名都是先定义的!怎么能出现这种:
    a.xml 字段名:aa
    b.xml 如果没有aa的字段.只有bb而你要求:
    obj实例需要a.xml
    obj.aa
    ob实例需要b.xml
    obj.bb
      

  21.   

    首先,合并数组为什么不用concat?其次,继承用prototype+闭包。
      

  22.   

    看来我描述的还是不够清楚,大家的理解千奇百怪的。我实际的目地是想将业务单,"业务单大家做系统都应该知道"  业务单的表是存在关系的,而我想把关系在后台通过AJAX返回了一个XML到前台。
    现在我要生成一个对象,让页面上的增删差改都在对象里做保存,只要不点真正意义上的保存按钮,我就不会把这个对象的数据写入数据库。而客户最终点保存按钮的时候,我会来分析这个关系对象,增加了多少条数据,删除了那些删除。最终实现通用业务单,也就是任何业务单无需要再写增删查改的操作了。
    第二,我的对象里有各个表名,也有他们的关系,并且拥有他们的字段,这样我可以动态生成SQL语句去执行它。最终就是一个通用效果,现在我通过配置查询出来了表关系的XML,但是需要在前台生成一个对象,来配合页面的操作,达到我想要的效果!。
      

  23.   


    看出点苗头了 ,是不是楼主想做类似ORM之类的? 其实有许多不错的框架可以参考的了...
      

  24.   

    对头,关系我是经过配置,是存储在服务器上的数据库里,通过AJAX请求,我会返回一个xml来表达业务单的关系,然后我想把这个xml生成一个对象,用来增删查改当前业务单。简化开发。
      

  25.   

    。。太坑了嘛。我现在把这个关系XML解析成了一个DOM对象,页面储存了这个DOM对象,页面的操作我用这个变量DOM来记录。也不知道能走得通不,大神们有好办法就丢出来嘛小弟会谢谢您的 !
      

  26.   

    JS只能操作页面,不能把数据写入xml文件,如果要修改xml文件你必须结合后台语言才行,比如JS+AJAX+PHP
    而且写入xml的语句大部分都是php或者其他后台语言完成的,你想的方法只是读取了xml然后在当前页面修改而已,没有意义的。
      

  27.   


    意义重大啊,目前我看开发模式,结构比较复杂的页面都是用到了离开行,或者离开某个区域保存,然后如果用户并不保存这个业务单 ?又要重新删除数据库的数据。
    比如这样的多产品      主表信息
    产品1
    产品2                   这里是个DIV存放产品的信息
    产品3我们的常规操作是点一个产品,然后右边DIV来加载相应信息。如果这个时候我修改了产品1的某些信息,然后我点产品2的信息。你们会不会将产品1的信息存入数据库呢 ????如果存了,用户并不保存业务单,就会出错。 如果不存,当用户修改完产品2的信息,想要确认一次产品1的信息是否修改正确的时候,用户再点击产品1,而这时候从数据库读取出来的信息,但是数据库并没做保存,相当于用户白修改了。。这个时候你会怎么做?我生成的对象分为原始对象,数据老对象,与页面操作对象,随便怎么操作,我都读取新对象里的数据(当然新对象会根据修改及时更新,用户保存的时候我就更新新对象的数据进数据库。)如果用户不保存,点了取消,我可以直接把新对象数据清空。读出数据老对象数据(原始对象也就是xml解析过后的关系对象,用来生成新对象和老数据对象的。)
      

  28.   

    还是使用json吧,json解析就没有这么复杂了,只要你把对象定义好就行了啊
      

  29.   

    我感觉有些理解他的思路了,,其实,在页面用户操作记录行中的某列值时,这条记录肯定有一个主键值,你可以把这行用户操作后的值,以JSON格式,存储,通过用户最终提交。把用户操作修改的记录的那个JSON 提交到后台。根据数据库中值与提交过来的JSON值作一个比较,有改变,则认为这个值用户已经修改
      

  30.   

    早就看到这个帖子了,一直想拿这个练手的,遗憾由于一直没有时间,楼主都已经散分了,我才把代码写好。
    不过还是发上来给大家分享一下吧。
    根据楼主的想法,要的其实不是一个简单的JSON数据,而是一个类似XML的可操作的属性数据。
    所以我使用的数据,让每个节点为一个对象,每个普通属性存储的是子节点集合(数组),子节点的$parent属性指向父节点,$value属性指向节点文本。
    代码兼容IE与Firefox,在FF下打开firebug来查看运行结果。XML代码如下:<?xml version="1.0" encoding="utf-8" ?>
    <CATALOG>
      <PLANT>
        <COMMON>Bloodroot</COMMON>
        <BOTANICAL>Sanguinaria canadensis</BOTANICAL>
        <ZONE>4</ZONE>
        <LIGHT>Mostly Shady</LIGHT>
        <PRICE>$2.44</PRICE>
        <AVAILABILITY>031599</AVAILABILITY>
      </PLANT>
      <PLANT>
        <COMMON>Columbine</COMMON>
        <BOTANICAL>Aquilegia canadensis</BOTANICAL>
        <ZONE>3</ZONE>
        <LIGHT>Mostly Shady</LIGHT>
        <PRICE>$9.37</PRICE>
        <AVAILABILITY>030699</AVAILABILITY>
      </PLANT>
      <PLANT>
        <COMMON>Marsh Marigold</COMMON>
        <BOTANICAL>Caltha palustris</BOTANICAL>
        <ZONE>4</ZONE>
        <LIGHT>Mostly Sunny</LIGHT>
        <PRICE>$6.81</PRICE>
        <AVAILABILITY>051799</AVAILABILITY>
      </PLANT>
    </CATALOG>JS代码如下:(function(){

    //将类数组对象自解为数组
    var slice = Array.prototype.slice; //简单的遍历函数
    function foreach(obj, fn, bind){
    for(var key in obj){
    if(obj.hasOwnProperty(key)){
    fn.call(bind, obj[key], key, obj);
    }
    }
    } //XML解析器
    var XML = {
    //创建XMLdom
    getDoc : function(){
    var xmldoc = null;
    var versions = ["MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","Microsoft.XmlDom"];
    if(window.ActiveXObject){
    foreach(versions, function(version){
    try{
    xmldoc= new ActiveXObject(version);
    }catch(e){}
    });
    }else{
    xmldoc = document.implementation.createDocument('','',null);
    }
    return xmldoc;
    },
    //加载XML文件
    load : function(src){
    var xmldoc = this.getDoc();
    xmldoc.async = false;
    xmldoc.load(src);
    return xmldoc;
    },
    //解析为一个数据对象
    parse : function(xmldoc){
    var root = xmldoc.getElementsByTagName('*')[0]; //获取根节点
    var top = {};
    var current = {};
    top[root.nodeName] = [];
    current.$parent = top;
    top[root.nodeName].push(current);
    this.parseNode(root, current);
    return top;
    },
    //以递归的方式解析XML树对象的节点
    parseNode : function(node, parent){
    var children = this.getChildren(node);
    foreach(children, function(child){
    var current = {};
    var nodeName = child.nodeName;
    current.$parent = parent;
    if(child.childNodes[0]){
    current.$value = child.childNodes[0].nodeValue;
    }
    if(!parent[nodeName]){
    parent[nodeName] = [];
    }
    parent[nodeName].push(current);
    this.parseNode(child, current);
    }, this);
    },
    //获取一个节点的子节点
    getChildren : function(node){
    var arr = [];
    var children = slice.call(node.childNodes);
    foreach(children, function(el){
    if(el.nodeType == 1){
    arr.push(el);
    }
    });
    return arr;
    }
    };

    var xmldoc = XML.load('data.xml');
    var data = XML.parse(xmldoc);
    console.log(data); //树形结构数据
    console.log(data.CATALOG[0].PLANT[1].BOTANICAL[0].$value); //Aquilegia canadensis})();