目前只能给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的所有属性。嗯,大概先这些,有不明白的地方,大神们尽管提出,解决之后有重谢。在线等!!!
好了,首先,我们看一个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的所有属性。嗯,大概先这些,有不明白的地方,大神们尽管提出,解决之后有重谢。在线等!!!
<tagxml_0>中systemore是<tagxml_1><tagxml_2>.....<tagxml_n>的父节点。你要生成一个对象,既包含了父节点中所有属性<tfiled>o_id,sys_name,sys_masrk</tfiled>,又包含了子节点<tfiled>中的属性??????????
<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>
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){
......
}
因为this.???这个是动态从xml读取的,并不是直接就知道的。所以我前面有了
eval("this."+arr[i].o_id+"=arr[i].o_id")这种方法来生成。
用json表示xml,
然后就可以轻松的存储到数据库中了
备注:你告诉大家用js来构造对象,这绝对会先入为主,误导大家的,,,
这个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.子表名 属于那个表.
{ systemmore:{"o_id":"",sys_name:"","sys_masrk":""},
sons:[ {son1:[{"o_id":"",}]}, {son2:[]}]
}
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文件。
我就是说明问题的,如果有更好的方式表达,请教大神们了。用js的对象来表达xml的描述。
<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数据进行描述。如果这样理解,方法就很简单了。
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是这样理解吗?
http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
比如dataset名字为ds里有N个表。可以这样ds.tables[0].rows
ds.tables[1].rows
ds.tables[n].rows 这样每个数组都拥有rows的属性,简单来说我这个大概是需要用到这个方法,而且我这个实际大概的意思就是 在前台生成一个js对象,它跟c#的dataset对象差不多。
==========================obj.孙表名.字段名=================
对象的方法名都是先定义的!怎么能出现这种:
a.xml 字段名:aa
b.xml 如果没有aa的字段.只有bb而你要求:
obj实例需要a.xml
obj.aa
ob实例需要b.xml
obj.bb
现在我要生成一个对象,让页面上的增删差改都在对象里做保存,只要不点真正意义上的保存按钮,我就不会把这个对象的数据写入数据库。而客户最终点保存按钮的时候,我会来分析这个关系对象,增加了多少条数据,删除了那些删除。最终实现通用业务单,也就是任何业务单无需要再写增删查改的操作了。
第二,我的对象里有各个表名,也有他们的关系,并且拥有他们的字段,这样我可以动态生成SQL语句去执行它。最终就是一个通用效果,现在我通过配置查询出来了表关系的XML,但是需要在前台生成一个对象,来配合页面的操作,达到我想要的效果!。
看出点苗头了 ,是不是楼主想做类似ORM之类的? 其实有许多不错的框架可以参考的了...
而且写入xml的语句大部分都是php或者其他后台语言完成的,你想的方法只是读取了xml然后在当前页面修改而已,没有意义的。
意义重大啊,目前我看开发模式,结构比较复杂的页面都是用到了离开行,或者离开某个区域保存,然后如果用户并不保存这个业务单 ?又要重新删除数据库的数据。
比如这样的多产品 主表信息
产品1
产品2 这里是个DIV存放产品的信息
产品3我们的常规操作是点一个产品,然后右边DIV来加载相应信息。如果这个时候我修改了产品1的某些信息,然后我点产品2的信息。你们会不会将产品1的信息存入数据库呢 ????如果存了,用户并不保存业务单,就会出错。 如果不存,当用户修改完产品2的信息,想要确认一次产品1的信息是否修改正确的时候,用户再点击产品1,而这时候从数据库读取出来的信息,但是数据库并没做保存,相当于用户白修改了。。这个时候你会怎么做?我生成的对象分为原始对象,数据老对象,与页面操作对象,随便怎么操作,我都读取新对象里的数据(当然新对象会根据修改及时更新,用户保存的时候我就更新新对象的数据进数据库。)如果用户不保存,点了取消,我可以直接把新对象数据清空。读出数据老对象数据(原始对象也就是xml解析过后的关系对象,用来生成新对象和老数据对象的。)
不过还是发上来给大家分享一下吧。
根据楼主的想法,要的其实不是一个简单的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})();