nancy
版主
积分:1072

如何多次读取分割成若干个小的xml文档?

23)问:数据分割成若干个小的xml文档是可以的,但是如何进行多次读取?如果是datapointer的话,是否先将datapointer指向第一个文件,等第一个文件遍历完之后再将其指向下一个文件,以此类推?这样如何保证内存的使用不会过大,在datapointer指向下一个文件之前是否需要将原来加载的数据清除,如何清除?或者是否有更好的方法实现多个数据文件多次读取。望能举例说明。

答:在OpenFace应用程序中,<dataset>就提供了一种封装XML数据的方法。取决于数据源的种类,数据集可以使动态的也可以是静态的。当数据集通过”type=http”显式地声明时,src属性的值就解译为一个URL,此时数据集在运行时装载数据。如果src数据缺省,那么它表达的数据就应该包含在<dataset>标签内,于是数据直接编译进应用程序。
当我们说HTTP数据集是动态的时,即意味着我们可以使用程序方式来重新装载数据。具体方法是:调用数据集对象的doRequest()方法;或如果request属性被设置为true,通过通过调用setSrc(),setQueryString(),或setQueryParam()来改变数据集的URL及请求的参数(如果是一个静态的XML是不需要请求参数的)。

通过改变数据集URL就达到了一个dataset指向多个xml文档,这样避免了一次一下子载入很大的一个文档。上面几个函数具体请见编程参考手册dataset部分。
下面的例子,按数字键1请求data1.xml,按数字键2请求data2.xml。

<canvas width="240" height="320" >
<dataset name="mydata" type="http">
</dataset> 

<simplelayout axis="y" spacing="5"/>
<text y="10" fontsize="20" resize="true" datapath="mydata:/myXML/text()"/> 

<text id="tmp" fontsize="20" resize="true" text="hello"/>
<handler name="onkeydown" reference="LzKeys" args="key">
switch(key){
case 49:
mydata.setSrc("http://222.128.6.118/test/data1.xml");
mydata.doRequest(); 

break;
case 50:
mydata.setSrc("http://222.128.6.118/test/data2.xml");
mydata.doRequest(); 

break; 

}
tmp.setText(""+key); 

</handler>
</canvas> 

nancy
版主
积分:1072

周一, 07/14/2008 - 03:44 — xhm1027

运行doRequest()方法时能在界面上显示诸如“数据采集中,请等待.....”的效果吗?
我看了,用ajax可以做到,但是直接用数据集的doRequest方法能实现吗?

nancy
版主
积分:1072

其实,使用数据集和ajax的背后的原理都差不多,数据集相当于再封装了一层。
“数据采集中”这句话是在请求开始时到请求结束时显示的,ajax是根据它请求的4个状态来判断请求开始和请求结束的。

数据集是否能做到这点呢?实际就变成你能否判断数据请求开始和结束。结论是可以的。很明显,当你调用doRequest时就是请求开始的时候,而当数据集的内容变化时就是请求结束的时候(通过ondata事件)。

也许你还会碰到一些问题,我觉得这样的问题最好是自己多去体会、思考解决,所谓知其然还要知其所以然,我直接告诉你方法也许对你解决这个问题很有帮助,但是不利于你自行解决问题。

nancy
版主
积分:1072

周三, 07/16/2008 - 23:45 — xhm1027

使用了这个方法,发现一个问题: 加载第一个src(data1.xml) 的时候在模拟器中正常,当用函数mydata.setSrc("data2.xml");mydata.doRequest(); 时模拟器就死掉了。
而第一次加载data2.xml时正常,而第二次用函数加载data1.xml模拟器也死掉了。
log文件的错误提示应该是“WARNING!!! vm->heap uses much memory!!! request bytes 120 ”,应该是内存溢出。
请问如何处理?

nancy
版主
积分:1072

两个xml文档分别有多大?
一种可能是两个XML比较大,导致内存不够。比如说在载入第二XML时,第一个XML产生的数据还在使用,相关的一些内存没有或者部分没有被释放。
应用能够载入多大的XML取决于应用其它部分消耗的内存。一般来说如果怀疑XML过大导致内存不够,可以把XML文件弄小看看。

另外如果觉得不是XML文件大小导致的内存不够死机,可以只把XML载入进行,但是不把dataset绑定到任何对象之上(包括不要用datapointer指向它),看看是否还会因内存不足死机。

这种问题凭描述一般很难判别是什么问题,如何解决,如果自己解决不成功的话可以把代码发出来看看。

xhm1027
游民
积分:112

[/code]我的开发问题,在web下没有问题,在模拟器下发生如下问题:
当再次载入文件时就发生问题,多出条目来了。
主要文件有3个:index.lzx,book1.xml,book2.xml。操作方式为,上“w”键,下“s”键,进入“r”或"enter"键,后退为“q”键。
请求解答原因。
index.lzx文件如下:

<?xml version="1.0" encoding="utf-8"?>
<canvas width="240" height="320">
<dataset name="books">
   <bookshelf>
   <book>
   	<num>第一册</num>
   </book>
   <book>
   	<num>第二册</num>
   </book>
   </bookshelf>
</dataset>
<dataset name="lessons" type="http">
</dataset>
<dataset name="lesson" type="http">
</dataset>  
<view id="bg"  height="320" resource="images/rmw-background.gif" visible="true">
		
		<attribute name="findex" type="number" value="1" />
    <text id="lb" x="40" y="295" fontsize="14"  fgcolor="#0033ff" fontstyle="bold" text="确认"/>
    <text id="rb" x="170" y="295" fontsize="14" fgcolor="#0033ff" fontstyle="bold" text="返回"/>
</view>
  
<view y="50"  id="booklist" visible="false">
   <attribute name="findex" type="number" value="0" />
   <drawview id="drawbg1" y="0">
       <method name="drawrect" ><![CDATA[
           this.clear();
           this.rect(3,15,235,30);
           this.strokeStyle=0x0033ff;
           this.stroke();  
       ]]></method>
  </drawview>  
   <view fontsize="16" y="15"  id="bookID">
       <simplelayout axis="y" spacing="20" />
       <view datapath="books:/bookshelf/book" fgcolor="#660066">
           <view x="85" y="8" resource="images/rmw-ico-6.gif" />
           <text x="90" datapath="num/text()" name="t1" fontstyle="bold"/>
       </view>
   </view>
</view>

<view y="40" id="lessonlist"  visible="false">
   <attribute name="findex" type="number" value="0" />
   <attribute  name="showdex"  type="number" value="0" />
   <drawview id="drawbg2" y="0">
       <method name="drawrect" ><![CDATA[
           this.clear();
           this.rect(3,15,235,20);
           this.strokeStyle=0xCA0002;
           this.stroke();  
       ]]></method>
  </drawview>
   <view  name="lessoncoat"  y="15" height="220" width="240" clip="true"> 
   <view fontsize="10"  id="lessonID" >
       <simplelayout axis="y" spacing="10" />
       <view datapath="lessons:/lessons/lesson" fgcolor="#000000" id="lessonlistview">
           <text x="5" height="30" datapath="title/text()" name="t1" fontstyle="bold"/>
       </view>
   </view>
 </view>
</view>
<handler name="oninit">   
	booklist.setVisible(true);
   	drawbg1.drawrect();
</handler>
<method name="move" args="index">
    if(booklist.getAttribute("visible") == true)
    {
       	 booklist.findex = booklist.findex + index;
         if(booklist.findex == bookID.subviews.length)
         {
            booklist.findex = 0;
         }
         if(booklist.findex==-1)
             booklist.findex=bookID.subviews.length-1;

         drawbg1.setAttribute("y",booklist.findex*40);//移动框
         lessonlist.findex = 0;
         drawbg2.setAttribute("y",lessonlist.findex*40);//将下级子目录的选中框设置为第一个
   }else if(lessonlist.getAttribute("visible") == true)
    {
        lessonlist.findex = lessonlist.findex + index;
         if(lessonlist.findex == lessonID.subviews.length)
         {
            lessonlist.findex = 0;
         }
         if(lessonlist.findex==-1)
             lessonlist.findex=lessonID.subviews.length-1;

         drawbg2.setAttribute("y",lessonlist.findex*40);//移动框
   }
</method>

<handler name="onkeydown"  args="key" reference="LzKeys">
<![CDATA[
    var keycode = key;
    switch(keycode){
        case 87:
        case 4112:
          //up
            canvas.move(-1);
            break;
        case 83:
        case 4113:
          //down
            canvas.move(1);
            break;
        case 13:
        case 4114: //enter
        case 81:
        case 4108:
        		if(booklist.getAttribute("visible"))//进入课程页面
            {
            	 lessonV.main.contents.setAttribute("y",0);
               booklist.setVisible(false);
               var ex=booklist.findex+1;
               var str="book"+ex+".xml";
               lessons.setSrc(str);
							 lessons.doRequest();
							 lessonlist.setVisible(true);
               drawbg2.drawrect();//画显示框
               lessonlist.findex=0;
               lessonlist.showdex=0;
            }
            break;       
        case 69:
        case 4109:         //right button
        	 if(lessonlist.getAttribute("visible")==true){//退回到书目页面
              booklist.setVisible(true);
              lessonlist.setVisible(false);
           }
            break;    
    }
    ]]>
    </handler>
</canvas>

book1.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<lessons>
	<lesson>
		<title>1 Excuse me!</title>
	</lesson>
	<lesson>
		<title>3 Sorry sir.</title>
	</lesson>  
</lessons>

book2.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<lessons><lesson>
<title>1 A private conversation
</title>
</lesson>
<lesson>
<title>2 Breakfast or lunch?
</title>
</lesson>
</lessons>

nancy
版主
积分:1072

很抱歉,您的代码无法正常显示,这个问题我们正在解决中
请您讲您的代码放在记事本中更替一下再贴上来

具体需要更替的内容和方式如下:
"<" 转换为 &lt ;
">" 转换为 &gt ;

xhm1027
游民
积分:112

index.lzx文件如下:
< ?xml version="1.0" encoding="utf-8"? >
< canvas width="240" height="320" >
< dataset name="books" >
< bookshelf >
< book >
< num > 第一册< /num >
< /book >
< book >
< num > 第二册< /num >
< /book >
< /bookshelf >
< /dataset >
< dataset name="lessons" type="http" >
< /dataset >
< dataset name="lesson" type="http" >
< /dataset >
< view id="bg" height="320" resource="images/rmw-background.gif" visible="true" >

< attribute name="findex" type="number" value="1" / >
< text id="lb" x="40" y="295" fontsize="14" fgcolor="#0033ff" fontstyle="bold" text="确认"/ >
< text id="rb" x="170" y="295" fontsize="14" fgcolor="#0033ff" fontstyle="bold" text="返回"/ >
< /view >

< view y="50" id="booklist" visible="false" >
< attribute name="findex" type="number" value="0" / >
< drawview id="drawbg1" y="0" >
< method name="drawrect" > < ![CDATA[
this.clear();
this.rect(3,15,235,30);
this.strokeStyle=0x0033ff;
this.stroke();
]] > < /method >
< /drawview >
< view fontsize="16" y="15" id="bookID" >
< simplelayout axis="y" spacing="20" / >
< view datapath="books:/bookshelf/book" fgcolor="#660066" >
< view x="85" y="8" resource="images/rmw-ico-6.gif" / >
< text x="90" datapath="num/text()" name="t1" fontstyle="bold"/ >
< /view >
< /view >
< /view >

< view y="40" id="lessonlist" visible="false" >
< attribute name="findex" type="number" value="0" / >
< attribute name="showdex" type="number" value="0" / >
< drawview id="drawbg2" y="0" >
< method name="drawrect" > < ![CDATA[
this.clear();
this.rect(3,15,235,20);
this.strokeStyle=0xCA0002;
this.stroke();
]] > < /method >
< /drawview >
< view name="lessoncoat" y="15" height="220" width="240" clip="true" >
< view fontsize="10" id="lessonID" >
< simplelayout axis="y" spacing="10" / >
< view datapath="lessons:/lessons/lesson" fgcolor="#000000" id="lessonlistview" >
< text x="5" height="30" datapath="title/text()" name="t1" fontstyle="bold"/ >
< /view >
< /view >
< /view >
< /view >
< handler name="oninit" >
booklist.setVisible(true);
drawbg1.drawrect();
< /handler >
< method name="move" args="index" >
if(booklist.getAttribute("visible") == true)
{
booklist.findex = booklist.findex + index;
if(booklist.findex == bookID.subviews.length)
{
booklist.findex = 0;
}
if(booklist.findex==-1)
booklist.findex=bookID.subviews.length-1;

drawbg1.setAttribute("y",booklist.findex*40);//移动框
lessonlist.findex = 0;
drawbg2.setAttribute("y",lessonlist.findex*40);//将下级子目录的选中框设置为第一个
}else if(lessonlist.getAttribute("visible") == true)
{
booklist.findex = booklist.findex + index;
if(lessonlist.findex == lessonID.subviews.length)
{
lessonlist.findex = 0;
}
if(lessonlist.findex==-1)
lessonlist.findex=lessonID.subviews.length-1;

drawbg2.setAttribute("y",lessonlist.findex*40);//移动框
}
< /method >

< handler name="onkeydown" args="key" reference="LzKeys" >
< ![CDATA[
var keycode = key;
switch(keycode){
case 87:
case 4112:
//up
canvas.move(-1);
break;
case 83:
case 4113:
//down
canvas.move(1);
break;
case 13:
case 4114: //enter
case 81:
case 4108:
if(booklist.getAttribute("visible"))//进入课程页面
{
lessonV.main.contents.setAttribute("y",0);
booklist.setVisible(false);
var ex=booklist.findex+1;
var str="book"+ex+".xml";
lessons.setSrc(str);
lessons.doRequest();
lessonlist.setVisible(true);
drawbg2.drawrect();//画显示框
lessonlist.findex=0;
lessonlist.showdex=0;
}
break;
case 69:
case 4109: //right button
if(booklist.getAttribute("visible")==true){//退出程序
//todo
}
else if(lessonlist.getAttribute("visible")==true){//退回到书目页面
booklist.setVisible(true);
lessonlist.setVisible(false);
}
break;
}
]] >
< /handler >
< /canvas >

xml文件如下:
< ?xml version="1.0" encoding="utf-8"? >
< lessons >
< lesson >
< title >1 Excuse me!< /title >
< /lesson >
< lesson >
< title >3 Sorry sir.< /title >
< /lesson >
< /lessons >

nancy
版主
积分:1072

请您将完整的源文件打包过来。
不过该问题基本可以判定为EFC的bug。

xhm1027
游民
积分:112

请问你的邮箱是多少?

openface
技术支持
积分:400

nancy为OpenFace技术支持之一,需要问题的解答只需发邮件到技术支持即可 techsupport@eloomobile.com