<?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();
}
<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();
}
异常指向哪个地方? 给看一下,另外,你可以考虑用 xpath,应该不会很麻烦
<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)
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
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
我也不熟,刚查的
原来用过,但忘了
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.
xpath
试了下 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.
document = saxReader.read(new ByteArrayInputStream(str.getBytes("UTF-8")));一般处理XML,最好是以字节流读进来,丢给SAX就可以了,不要先转成字符串又转成字节。
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应经把问题给解决了,只是没有指定字符串的编码方式而已。
异常指向哪个地方? 给看一下,另外,你可以考虑用 xpath,应该不会很麻烦
现在工程里所使用的的编码方式是GBK,如果我修改为UTF-8的话其它页面就会有乱码了;
那是否可以不修改编码方式呢?~
如果不行 那如果将li存在一个xml文件中再用上面的例子来解析是否会解决问题呢?
document = saxReader.read(new ByteArrayInputStream(str.getBytes("GBK")));
你把字节流改成 GBK 看下,如果你的字符串是这样的话当然,先存到 文件中也不错
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:有我在自己电脑上试过了,这个方法解析是正确的。