求一段:dom4j 解析xml字符串 代码

tts227 2008-11-06 11:35:02
<?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();
}
...全文
5000 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dage 2012-03-14
  • 打赏
  • 举报
回复
把你的工程中的字符编码与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:有

我在自己电脑上试过了,这个方法解析是正确的。
JavaStudy2011 2012-03-13
  • 打赏
  • 举报
回复
学习学习学习
wangyiding111 2011-01-09
  • 打赏
  • 举报
回复
this is what I want thx
xwy55555 2008-11-20
  • 打赏
  • 举报
回复
document = saxReader.read(new ByteArrayInputStream(str.getBytes("UTF-8")));

换成这种方式,就可以了,我试过了
laorer 2008-11-10
  • 打赏
  • 举报
回复
可以考虑
document = saxReader.read(new ByteArrayInputStream(str.getBytes("GBK")));
你把字节流改成 GBK 看下,如果你的字符串是这样的话

当然,先存到 文件中也不错

hmsuccess 2008-11-10
  • 打赏
  • 举报
回复
建议你看看孙鑫的<java web开发详解>
tts227 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 neunaruto 的回复:]
如果字符串li是xml文件的名字,直接用reader.read()即可。
5楼的laorer应经说的非常清楚了。
如果字符串li是xml文件的内容,需要把li转化成流才能作为read方法的参数使用。
你出现上述问题是因为字符串中含有中文字符,但是字符串编码却使用的是本地字符编码,中文系统下可能是gb2312。
为了解决这个问题,你需要指定字符串编码方式为utf-8.
我把eclipse当中的text file encoding改为utf-8(在properties当中设置),然后…
[/Quote]

现在工程里所使用的的编码方式是GBK,如果我修改为UTF-8的话其它页面就会有乱码了;
那是否可以不修改编码方式呢?~
如果不行 那如果将li存在一个xml文件中再用上面的例子来解析是否会解决问题呢?
laorer 2008-11-06
  • 打赏
  • 举报
回复
List ltSrvs = doc.selectNodes("//ROOT/Information/Recording");
xpath
lisl2003 2008-11-06
  • 打赏
  • 举报
回复
read

public 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.
lisl2003 2008-11-06
  • 打赏
  • 举报
回复
doc = reader.read(li); //li即为上述xml字符串

调用方式不对。
laorer 2008-11-06
  • 打赏
  • 举报
回复
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
我也不熟,刚查的
原来用过,但忘了
laorer 2008-11-06
  • 打赏
  • 举报
回复
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
tts227 2008-11-06
  • 打赏
  • 举报
回复
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)
laorer 2008-11-06
  • 打赏
  • 举报
回复
no protocol
异常指向哪个地方? 给看一下,另外,你可以考虑用 xpath,应该不会很麻烦
macleane 2008-11-06
  • 打赏
  • 举报
回复
把异常帖出来嘛。

是不是XML字符串不是UTF-8编码的?
fool_leave 2008-11-06
  • 打赏
  • 举报
回复
楼主,用VTD吧,这个解析效率高,而且比较简单
tiyuzhongxin789 2008-11-06
  • 打赏
  • 举报
回复
no protocol
异常指向哪个地方? 给看一下,另外,你可以考虑用 xpath,应该不会很麻烦
ouyangxiaokang6 2008-11-06
  • 打赏
  • 举报
回复
不懂,up
neunaruto 2008-11-06
  • 打赏
  • 举报
回复
如果字符串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应经把问题给解决了,只是没有指定字符串的编码方式而已。


macleane 2008-11-06
  • 打赏
  • 举报
回复
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就可以了,不要先转成字符串又转成字节。
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧