dom要把xml全部读取内存才能解析,边读边解析应该用sax

解决方案 »

  1.   

    说说我个人的想法:请高手指点给 JDOM 处理程序建立一个 工作队列线程 ,jDOM线程从队列取得数据并解析.各个客户处理线程,在接收数据的同时记录数据,当一个 XML 数据发送完后(这里可以用客户端发送一个结束标记来实现)客户处理线程就向 JDOM 工作队列发送一个任务.
    让 JDOM 线程去处理,客户处理线程可以继续等待客户输入.不知可行不???
      

  2.   

    abcdhy(程旭)
    所说的跟我遇到的情况不是一回事,现在的问题不是怎样让JDOM处理数据,由于有各种不同的XML数据类型,因此各个线程会调用相应的方法去从流中解析XML数据。JDOM从流中读取数据处于阻塞状态,不能获得完整的数据。
    在网上看到资料说,SAX适合网络应用程序传输XML文档,是不是采纳了SAX就可以解决问题呢?
      

  3.   

    感觉楼上说的不错....
    如果用一个工作队的话这样去处理那些传送完成的数据..
    这样把接收数据和Jdom处理分开..减少他们间的影响...只是实现起来少微复杂了些....
      

  4.   

    我现在的处理过程是将流包装到XML解析对象(由JDOM实现)中去。
      

  5.   

    请大家抓住重点,现在不是怎样建立模型的问题,而是怎样解决问题?
    -------------------------------------------------------------------------------
    客户端同服务器端建立了一条SOCKET连接,然后向服务器不断发送数据,客户端已经将数据包装到OutputStream中,并且flush()了。服务器端通过一个循环读取数据流,由于数据格式是XML格式的,将流直接传递给JDOM去处理,解析出正确的数据出来。
    但是目前的现状是除非客户端发送数据断开SOCKET连接,不然服务器端处于阻塞的状态而JDOM根本无法得到流进而解析XML数据,但是期望是客户端不能每次发送数据就重新建立一条连接,这样非常浪费。
    目前很多例子里面都是将InputStream包装到BufferReaderStream中,然后包装到DataInputStream中,利用readxx()读取输入流中的数据。但是我的系统是将整个流传递给JDOM处理,没有读取内容的操作,因此程序处于停滞状态。
      

  6.   

    你可能是在服务器上读数据的时候和处理数据这两个方法上出了问题,首先你要确定什么时候一个客户端的数据才算是传送完了,另外一个Client传数据的时候,其它Client是不是也在传数据,那你又是怎样区分不同Client的数据的。这是一个问题,再就是把接收的数据交给流去处理,这也要时间处理的,它处理当中,你是不是还在接收Client的数据呀?也就是说你的接收数据的方法和处理数据的方法有没有同步?如果不同步的话就会出现这个Client的数据没有处理完,就又开始处理别的Client的数据了,同样也会出现一个Cliet的数据没有接收完,就开始接收其它Client的数据,这样恶性循环下去当然不行了。好好想想。
      

  7.   

    服务器每接受到一个SOCKET请求就会建立一个新的线程去处理,服务器会继续监听下一个SOCKET请求。
    每一个处理客户端请求的类之间不需要同步,彼此之间是独立的。关键在于:发送数据后断开连接JDOM才会解析出XML内容,而不断开是无法得到内容。
      

  8.   

    老大,你直接把InputStream传给JDOM这样不行的,InputStream不关闭之前JDOM怎么知道数据传送完了,InputStream是同步调用的,就一直阻塞在那里,直到关闭。
    所以你应该自己读取InputStream,读到一个缓冲中去,采用abcdhy(程旭) 提供的方法,产生一个任务队列一一交给JDOM API。如果想方便就读到一个byte[]再创建一个ByteArrayInputStream给JDOM解析。
      

  9.   

    客户端给服务器端发送数据,服务器端解析XML成功,要回复成功消息OK,flush后,在客户端用同样的方法读取流解析XML,但是读取的大小为0,通过read()方法阻塞读取却可以得到内容。前后不一致啊,非常郁闷。