javaxml解析dom4j
‘壹’ java dom4j解析xml
把xml节点名称中的中文换成英文试试。看看xml文件的编码是否正确,是否和指定的一致。
‘贰’ JAVA里dom4j解析xml
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.test;
import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jExample {
public static void main(String[] args) throws DocumentException, URISyntaxException {
URL urlfile = Dom4jExample.class.getResource("Config.xml");
File xml = new File(urlfile.toURI());
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(xml);
Element root = document.getRootElement(); //config
for ( Iterator iter = root.elementIterator(); iter.hasNext(); ) {
Element element = (Element) iter.next();
Attribute ageAttrIP=element.attribute("ip");
String ip = ageAttrIP.getValue();
System.out.println(ip);
Attribute ageAttrPORT=element.attribute("port");
String port = ageAttrPORT.getValue();
System.out.println(port);
}
}
}
找到之后,再把String转换成你需要的类型,就不写了。
‘叁’ java中dom4j解析xml文件怎么获取节点属性
dom4j中,使用Element.attributes方法可以获取到节点的属性,而使用elements则可以获取相应的子节点
比如:
Element root = doc.getRootElement();
List attrList = root.attributes();
for (int i = 0; i < attrList.size(); i++) {
//属性的取得
Attribute item = (Attribute)attrList.get(i);
System.out.println(item.getName() + "=" + item.getValue());
}
List childList = root.elements();
for (int i = 0; i < childList.size(); i++) {
//子节点的操作
Element it = (Element) childList.get(i);
//对子节点进行其它操作...
}
‘肆’ java解析xml有几种方法
SAX, DOM, jdom , dom4j四种
1、DOM(JAXP Crimson解析器)
DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。
2、SAX
SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。 选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,
告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。
特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,
而且很难同时访问同一个文档中的多处不同数据。
3、JDOM
JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。
正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。
JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。
第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。
JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。
然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。
JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。
它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。
4、DOM4J
虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始,它就一直处于开发之中。
为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。
DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J。
比较
1、DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
2、JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
3、SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)
网页链接
‘伍’ java dom4j解析xml 的编程思想是什么
就是把整个XML当成一颗document树来解析,每棵树的主干,就相当于根标签,根标签下面的其他标签就相当于树的一个节点,或者说分支,LZ你该去学的是XML的DOM的编程,dom4j只是别人写的好的工具而已,你可以用dom4j去解析XML文本,结果,你要什么结果,别人写这个工具的时候怎么知道你要从哪个XML文档里面得到哪些内容呢,所以都提供好的一些API给你自己去调用,通过这些API你就可以得到一个XML文档里面的任意内容了,你要调用dom4j里面的API去查,例如Document.getRootElement(),这个方法就可以帮你得到根节点,。说好的是解析,又怎么会存入数据库呢。
‘陆’ java dom4j解析一个xml文件怎么解析
步骤:
1. 引入jar文件(dom4j.jar)
2. 创建指向XML文档的输入流.
InputStream is = new FileInputStream("文件地址");
3. 创建一个XML读取工具对象
SAXReader sr = new SAXReader();
4. 通过读取工具, 读取xml文档的输入流. 并得到文档对象
Document doc = sr.read(is);
5. 通过文档对象, 获取XML文档的根节点对象
Element root = doc.getRootElement();
‘柒’ java的XML解析JDOM和DOM4J解析方式有什么区别》
其实我觉得差不多,xml的解析方式有sax和dom解析两种方式,而jdom和dom4j只是解析工具。其中sax解析是针对事件进行解析,效率较高吧,而最常用的是dom解析,就是从根元素开始对xml进行解析,因为是从头开始,所以当文档很大时,有时效率不高,另外修改删除也不是很方便。
jdom和dom4j用起来差不多,就是方法有一点小不同。你上网查查就知道了
‘捌’ 在java中怎么用dom4j解析XML文件
以下是曾经写的一个解析XML获取XML中图片流的字符串,获取并转化为图片的工具类
里面海带哟base64编码,具体代码如下,希望能帮到你
packagecom.asidel.web.util;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.OutputStream;
importjava.util.Iterator;
importjava.util.List;
importorg.dom4j.Document;
importorg.dom4j.DocumentHelper;
importorg.dom4j.Element;
importsun.misc.BASE64Decoder;
importsun.misc.BASE64Encoder;
importcom.dragonsoft.adapter.AdapterSend;
publicclassXMLparserUtil{
/**
*@Title:getXp
*@Description:解析XML
*@return
*/
publicstaticStringgetXp(StringxmlStr,Stringsfzh){
Stringxp="";
try{
//将String转化成xml
Documentdocument=DocumentHelper.parseText(xmlStr);
//获取Value节点下的Row子节点
ListRowElementList=XMLparserUtil.getRowElementList(document);
if(RowElementList!=null&&RowElementList.size()>0){
ElementRowElement3=(Element)RowElementList.get(RowElementList.size()-1);
//根据节点获取值
StringxpBase64=RowElement3.elementTextTrim("Data");
//System.out.println("xpBase64:"+xpBase64);
if(!"".equals(xpBase64)&&xpBase64!=null){
xp=XMLparserUtil.getDecodingBASE64(xpBase64,sfzh);
}
//System.out.println("xp:"+xp);
}
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
xp="";
}
returnxp;
}
/**
*@Title:getEncodingBASE64
*@Description:进行BASE64编码
*@paramstring
*@return
*/
(Stringstring){
StringreturnStr="";
if(!"".equals(string)&&string!=null){
try{
BASE64Encoderbase64Encoder=newBASE64Encoder();
returnStr=base64Encoder.encode(string.getBytes());
}catch(Exceptione){
//TODO:handleexception
e.printStackTrace();
}
}
returnreturnStr;
}
/**
*@Title:getDecodingBASE64
*@Description:将BASE64编码的字符串进行解码
*@paramstring
*@return
*/
(StringimgStr,StringimgName){
StringimgFilePath="";//新生成的图片
BASE64Decoderdecoder=newBASE64Decoder();
if(!"".equals(imgStr)&&imgStr!=null){
try{
byte[]b=decoder.decodeBuffer(imgStr);
for(inti=0;i<b.length;++i){
if(b[i]<0){//调整异常数据
b[i]+=256;
}
}
//生成jpeg图片
PathUtilpathUtil=newPathUtil();
Stringzdryxppath=pathUtil.getWebRoot()+"uploadImages/";
System.out.println("zdryxppath="+zdryxppath);
FilepathDir=newFile(zdryxppath);//如果目录不存在就创建该目录
if(!pathDir.exists()){
pathDir.mkdirs();
}
StringimgFileRealPath=zdryxppath+imgName+".jpg";//新生成的图片
OutputStreamout=newFileOutputStream(imgFileRealPath);
out.write(b);
out.flush();
out.close();
imgFilePath="uploadImages/"+imgName+".jpg";
}catch(Exceptione){
e.printStackTrace();
}
}
returnimgFilePath;
}
/**
*@Title:getRowElementList
*@Description:获取节点列表
*@paramdocument
*@paramstring
*@return
*
*/
(Documentdocument){
ListreturnRowElementList=null;
//获取根节点
ElementrootElement=document.getRootElement();
//System.out.println("rootElement:"+rootElement);
//获取根节点下的Method子节点
IteratorMethodElementList=rootElement.elementIterator("Method");
//遍历Method节点
while(MethodElementList.hasNext()){
ElementMethodElement=(Element)MethodElementList.next();
//System.out.println("Method:"+MethodElement);
//获取Method节点下的Items子节点
IteratorItemsElementList=MethodElement.elementIterator("Items");
//遍历Items节点
while(ItemsElementList.hasNext()){
ElementItemsElement=(Element)ItemsElementList.next();
//System.out.println("Items:"+ItemsElement);
//获取Items节点下的Item子节点
IteratorItemElementList=ItemsElement.elementIterator("Item");
//遍历Item节点
while(ItemElementList.hasNext()){
ElementItemElement=(Element)ItemElementList.next();
//System.out.println("Item:"+ItemElement);
//获取Item节点下的Value子节点
IteratorValueElementList=ItemElement.elementIterator("Value");
//遍历Value节点
while(ValueElementList.hasNext()){
ElementValueElement=(Element)ValueElementList.next();
//System.out.println("Value:"+ValueElement);
returnRowElementList=ValueElement.elements("Row");
////获取Value节点下的Row子节点
//List
//if(RowElementList!=null&&RowElementList.size()>
//0){
//ElementRowElement3=(Element)
//RowElementList.get(RowElementList.size()-1);
////System.out.println("Row:"+RowElement3);
////根据节点获取值
//xp=RowElement3.elementTextTrim("Data");
//System.out.println("xp:"+xp);
//}
}
}
}
}
returnreturnRowElementList;
}
publicstaticvoidmain(String[]args){}
}
‘玖’ 在java中xml有哪些解析技术
1.DOM生成和解析XML文档
为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM
接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
2.SAX生成和解析XML文档
为解决DOM的问题,出现了SAX。SAX
,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;
3.DOM4J生成和解析XML文档
DOM4J 是一个非常非常优秀的Java XML
API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写
XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。
4.JDOM生成和解析XML
为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。
新技术目前还木有,就是有了也不稳定,你也不敢用阿。
‘拾’ java 解析xml,dom4j解析,如下:
// 你要替换成你xml的地址
public static void read()
{
// 读取xml内容为字符串
StringBuffer xmlContent = new StringBuffer();
byte[] b = new byte[8*1024];
InputStream in = null;
try
{
in = new FileInputStream("D:/123.xml");
while(in.read(b) != -1){
xmlContent.append(new String(b));
}
in.close();
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if (in != null)
{
try
{
in.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 使用正则表达式匹配
Pattern compile = Pattern.compile("<DETAIL>[\\s\\S]*</DETAIL>");
Matcher matcher = compile.matcher(xmlContent.toString());
while (matcher.find())
{
System.out.println(matcher.group(0));
}
}