<?xml version="1.0" encoding="UTF-8"?>
<ROOT><Information><Name>AAA</Name><Number>BBB</Number><Recording>http://10.15.57.174/wav/2008/10/29/WG37100/ext37102/10.15.57.71!1~R!10292008_064002!37102!67256479!Ext!NA!1179371583!R.wav</Recording><Orders>有</Orders></Information></ROOT>
现有这样一个xml字符串现在想取出<Recording></Recording>中的字符串 (注:会有多个<Information>...</Information>)然后将Recording中的字符串存到数组中
在网上找了些资料,但试验时报no protocol 异常,我的eclipse工程是GBK和这个XML的UTF-8有冲突嘛?~
试验代码如下:
                        Document doc = null;
try{ 
SAXReader reader = new SAXReader(); 
doc = reader.read(li); //li即为上述xml字符串
Element root = doc.getRootElement();
Element foo;
for(Iterator i = root.elementIterator("Information");i.hasNext();){
foo = (Element) i.next();
list.add(foo.elementText("Recording"));
for(Iterator a = list.iterator();i.hasNext();){
System.out.println(a.next()); }
}
}catch(Exception e){
e.printStackTrace();
}

解决方案 »

  1.   

    把异常帖出来嘛。是不是XML字符串不是UTF-8编码的?
      

  2.   

    no protocol 
    异常指向哪个地方? 给看一下,另外,你可以考虑用 xpath,应该不会很麻烦
      

  3.   

    org.dom4j.DocumentException: no protocol: <?xml version="1.0" encoding="UTF-8"?>
    <ROOT><Information><Name>AAA</Name><Number>BBB</Number><Recording>http://10.15.57.174/wav/2008/10/29/WG37100/ext37102/10.15.57.71!1~R!10292008_064002!37102!67256479!Ext!NA!1179371583!R.wav</Recording><Orders>有</Orders></Information></ROOT> Nested exception: no protocol: <?xml version="1.0" encoding="UTF-8"?>
    <ROOT><Information><Name>AAA</Name><Number>BBB</Number><Recording>http://10.15.57.174/wav/2008/10/29/WG37100/ext37102/10.15.57.71!1~R!10292008_064002!37102!67256479!Ext!NA!1179371583!R.wav</Recording><Orders>有</Orders></Information></ROOT>
    at org.dom4j.io.SAXReader.read(SAXReader.java:484)
    at org.dom4j.io.SAXReader.read(SAXReader.java:321)
    at com.crea.binternal.county.bw_countyelecvsmonitoraction.Listener(bw_countyelecvsmonitoraction.java:83)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:324)
    at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
    at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
    at com.crea.base.core.CUDispatchAction.execute(Unknown Source)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    at com.crea.base.core.Servlet.doGet(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:534)
      

  4.   

    SAXReader reader = new SAXReader(false);(一) 在用reader.read(String filename)传递的是文件名的时候
    1。在eclipse环境运行的程序没有错误(swt程序,控制台程序)
    2。在独立出来的应用程序中运行,throw Exception : 
      org.dom4j.DocumentException: no protocol: ...
     (二) 但是在用  reader.read(new File(filename))  则没有问题       困惑的地方在于在eclipse的环境中运行没有出现该错误,打包成.jar,独立运行时在一的情况下有问题!!!
     http://www.cnblogs.com/ytfei/archive/2005/11/01/266651.html 
      

  5.   

    public void strChangeXML(String str) throws IOException {
       SAXReader saxReader = new SAXReader();
       Document document;
       try {
        document = saxReader.read(new ByteArrayInputStream(str.getBytes()));   
    http://hi.baidu.com/vjame/blog/item/ecafaa6445a4d9f4f6365455.html 
    saxReader.read 的方法是从文件,或者流中读取的,你要看下api
    我也不熟,刚查的
    原来用过,但忘了
      

  6.   

    doc = reader.read(li); //li即为上述xml字符串调用方式不对。
      

  7.   

    readpublic Document read(String systemId)
                  throws DocumentException    Reads a Document from the given URL or filename using SAX.    If the systemId contains a ':' character then it is assumed to be a URL otherwise its assumed to be a file name. If you want finer grained control over this mechansim then please explicitly pass in either a URL or a File instance instead of a String to denote the source of the document. 
      

  8.   

    List ltSrvs = doc.selectNodes("//ROOT/Information/Recording");
    xpath 
      

  9.   


    试了下  document = saxReader.read(new ByteArrayInputStream(str.getBytes()));  
    报错:
    org.dom4j.DocumentException: Invalid byte 1 of 1-byte UTF-8 sequence. Nested exception: Invalid byte 1 of 1-byte UTF-8 sequence.
      

  10.   

    Invalid byte 1 of 1-byte UTF-8 sequence. Nested exception: Invalid byte 1 of 1-byte UTF-8 sequence.如果你字符串本身是UTF-8的话,要
    document = saxReader.read(new ByteArrayInputStream(str.getBytes("UTF-8")));一般处理XML,最好是以字节流读进来,丢给SAX就可以了,不要先转成字符串又转成字节。
      

  11.   

    如果字符串li是xml文件的名字,直接用reader.read()即可。
    5楼的laorer应经说的非常清楚了。
    如果字符串li是xml文件的内容,需要把li转化成流才能作为read方法的参数使用。
    你出现上述问题是因为字符串中含有中文字符,但是字符串编码却使用的是本地字符编码,中文系统下可能是gb2312。
    为了解决这个问题,你需要指定字符串编码方式为utf-8.
    我把eclipse当中的text file encoding改为utf-8(在properties当中设置),然后在java文件
    定义
    String li = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ROOT><Information><Name>AAA </Name><Number>BBB </Number><Recording>http://10.15.57.174/wav/2008/10/29/WG37100/ext37102/10.15.57.71!1~R!10292008_064002!37102!67256479!Ext!NA!1179371583!R.wav </Recording> <Orders>�有</Orders></Information></ROOT> ";
    再把
    doc = reader.read(li); 
    改为
    doc=reader.read(new ByteArrayInputStream(li.getBytes("utf-8")));
    其实laorer应经把问题给解决了,只是没有指定字符串的编码方式而已。
      

  12.   

    no protocol 
    异常指向哪个地方? 给看一下,另外,你可以考虑用 xpath,应该不会很麻烦 
      

  13.   

    楼主,用VTD吧,这个解析效率高,而且比较简单
      

  14.   


    现在工程里所使用的的编码方式是GBK,如果我修改为UTF-8的话其它页面就会有乱码了;
    那是否可以不修改编码方式呢?~
    如果不行 那如果将li存在一个xml文件中再用上面的例子来解析是否会解决问题呢?
      

  15.   

    可以考虑
    document = saxReader.read(new ByteArrayInputStream(str.getBytes("GBK"))); 
    你把字节流改成 GBK 看下,如果你的字符串是这样的话当然,先存到 文件中也不错
      

  16.   

    建议你看看孙鑫的<java web开发详解>
      

  17.   

    document = saxReader.read(new ByteArrayInputStream(str.getBytes("UTF-8"))); 换成这种方式,就可以了,我试过了
      

  18.   

    this is what I want thx 
      

  19.   

    把你的工程中的字符编码与XML格式的设置成一样就行了,代码如下:
    package cn.gao;
    import java.io.File;
    import java.net.MalformedURLException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;public class Dom4jReader { public static void main(String[] args) {
    File file = new File("d:"+File.separator+"output.xml");
    Document doc = null;
    try{  
    SAXReader reader = new SAXReader();  
    doc = reader.read(file);
    }catch(Exception e){
    e.printStackTrace();
    }
    Element root = doc.getRootElement();
    Iterator iter = root.elementIterator();
    while(iter.hasNext()){
    Element infor = (Element) iter.next();

    System.out.println("Name:"+infor.elementText("Name"));
    System.out.println("Number:"+infor.elementText("Number"));
    System.out.println("Recording:"+infor.elementText("Recording"));
    System.out.println("Orders:"+infor.elementText("Orders"));
    }
    }
    }我是在d:/output.xml文件
    解析出来的结果:
    Name:AAA
    Number:BBB
    Recording:http://10.15.57.174/wav/2008/10/29/WG37100/ext37102/10.15.57.71!1~R!10292008_064002!37102!67256479!Ext!NA!1179371583!R.wav
    Orders:有我在自己电脑上试过了,这个方法解析是正确的。