最后成果:
package test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
/**
* 实现功能简述:
* 从URL获取XML数据转为String形式;
* 再将String形式的XML对象转换为document对象;
* (使用jdom.jar工具解析,不支持将已转换为Document的XML转换为String形式;
* 也不支持直接将String形式的XML数据转换为Document对象)
* @author Ginger_Z
*
*/
public class jdomTest {
public static void main(String[] args) {
URL url;
InputStream is = null;
ByteArrayOutputStream os = null;
ByteArrayInputStream bais = null;
try {
url =new URL("http://localhost:8080/test/servlet/tsetServlet");
HttpURLConnection huc=(HttpURLConnection)url.openConnection();
is=huc.getInputStream();//获取信息流
byte[] b=new byte[1024];//创建缓冲区
int len=-1;
os=new ByteArrayOutputStream();
while((len=is.read(b))!=-1){
os.write(b,0,len);//将数据读入字节数组流
}
byte[] bb=os.toByteArray();
String dates=new String(bb,"utf-8");
System.out.println(dates);//输出从网页获取的原始数据
bais=new ByteArrayInputStream(bb);//用将字节数组创建字节数组输入流
SAXBuilder bulid=new SAXBuilder();
/**
* build()的参数:URL
* 或InputStream
* 或java.io.File file
* 或String systemId - URI for the input
*/
Document doc=bulid.build(is);//使用字节数组输入流创建Document对象;
Element element=doc.getRootElement();//获取根元素
List<Element> list=element.getChildren();//获取根元素下的所有子元素
for(Element e:list){
String VEHICLENAME=e.getChildText("VEHICLENAME");
System.out.println(VEHICLENAME);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{//关流
try {
if(is!=null)
is.close();
if(os!=null);
os.close();
if(bais!=null)
bais.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
问题:
获取URL返回数据的InputStream,将InputStream中的数据读出后,InputStream中的指针到达末尾,不可再次使用获取数据创建Document对象;
解决方式:
*ByteArrayInputStream 可已重复读取;
将已读取到ByteOutputStream中的数据取出为byte[];
使用byte[]创建字符串,以供记录使用;
再利用这个byte[]数组创建ByteArrayInputStream对象;
将ByteArrayInputStream传入 SAXBuilder .builder(ByteArrayInputStream),创建Document对象;
将使用过的InputStream再次使用创建Document对象报错:
org.jdom.input.JDOMParseException: Error on line 1: Premature end of file.