使用DOM4j解析xml文件

合集下载

java_Dom4j解析XML详解

java_Dom4j解析XML详解

学习:Dom4j1、DOM4J简介DOM4J是 出品的一个开源XML 解析包。

DOM4J应用于Java 平台,采用了Java 集合框架并完全支持DOM,SAX 和JAXP。

DOM4J 使用起来非常简单。

只要你了解基本的XML-DOM 模型,就能使用。

Dom:把整个文档作为一个对象。

DOM4J 最大的特色是使用大量的接口。

它的主要接口都在org.dom4j里面定义:接口之间的继承关系如下:interface ng.Cloneableinterface org.dom4j.Nodeinterface org.dom4j.Attributeinterface org.dom4j.Branchinterface org.dom4j.Documentinterface org.dom4j.Elementinterface org.dom4j.CharacterDatainterface org.dom4j.CDATAinterface mentinterface org.dom4j.Textinterface org.dom4j.DocumentTypeinterface org.dom4j.Entityinterface org.dom4j.ProcessingInstruction2、XML文档操作12.1、读取XML文档:读写XML文档主要依赖于org.dom4j.io包,有DOMReader和SAXReader两种方式。

因为利用了相同的接口,它们的调用方式是一样的。

public static Docum ent load(String filenam e) {Document docum ent =null;try {SAXReader saxReader = new SAXReader();docum ent =saxReader.read(new File(filename)); //读取XML文件,获得docum ent 对象} catch (Exception ex) {ex.printStackTrace();}return docum ent;}或public static Docum ent load(URL url) {Document docum ent =null;try {SAXReader saxReader = new SAXReader();docum ent =saxReader.read(url); //读取XML文件,获得docum ent对象} catch (Exception ex) {ex.printStackTrace();}return docum ent;}//读取指定的xml文件之后返回一个Document对象,这个对象代表了整个XML文档,用于各种Do m运算。

org.dom4j.document的用法

org.dom4j.document的用法

org.dom4j.document的用法1.概述o r g.do m4j.do cu men t是一个J av a语言中常用的XM L文档处理库,提供了丰富的功能和便捷的A PI,可以用于解析、创建、修改和操作X ML 文档。

本文将介绍or g.d om4j.d oc um ent的用法,包括文档的创建、节点的查找和修改等。

2.创建文档要使用o rg.d om4j.d o cu me nt,首先需要引入相关的库文件或依赖。

然后可以通过以下方式创建空白的XM L文档:D o cu me nt do cu me nt=D oc um en tH el pe r.c r ea te Do cu me nt();接下来可以向文档中添加根节点和其他节点,例如:E l em en tr oo tE le men t=d oc um en t.ad dEl e me nt("ro ot");E l em en tc hi ld El eme n t=ro ot El em en t.a d dE le me nt("ch ild");3.查找节点o r g.do m4j.do cu men t提供了多种方法用于查找文档中的节点。

下面是几个常用的查找方法的示例:3.1通过路径查找可以使用XP at h表达式来查找节点,例如:E l em en te le me nt=(E l em en t)do cu me nt.s el ec tS in gl eN ode("//r o o t/c hi ld");3.2通过名称查找可以使用节点的名称查找节点,例如:E l em en te le me nt=do c um en t.ge tR oo tEl e me nt().e le me nt("ch il d ");3.3通过属性查找可以使用节点的属性来查找节点,例如:E l em en te le me nt=(E l em en t)do cu me nt.s el ec tS in gl eN ode("//r o o t/c hi ld[@at tr='v a lu e']");4.修改节点o r g.do m4j.do cu men t也允许对节点进行修改操作,包括添加、删除和修改节点的属性等。

dom4j element方法总结

dom4j element方法总结

dom4j element方法总结DOM4J是一个Java库,用于处理XML文档。

它提供了一种方便的方式来解析、修改和创建XML文档。

以下是DOM4J Element的一些常用方法:1. 获取子元素:`List<Element> elements()`: 获取当前元素的所有子元素。

`List<Element> elements(String name)`: 根据指定的元素名称获取所有子元素。

`Element element(String name)`: 根据指定的元素名称获取子元素对象,如果元素名称重复,则获取第一个元素。

2. 获取和设置文本内容:`String getText()`: 获取当前元素对象的文本内容。

`void setText(String text)`: 设置当前元素对象的文本内容。

3. 获取属性值:`String attributeValue(String name)`: 根据指定的属性名称获取其对应的值。

4. 添加属性:`public Element addAttribute(String name, String value)`: 根据指定的属性名称和值进行添加或修改。

5. 获取根元素:`Element getRootElement()`: 获取根元素对象(根标签)。

6. 遍历所有元素节点:可以通过递归的方式遍历所有元素节点并打印它们的名称。

首先获取根元素,然后对每个子元素递归调用此方法。

7. 其他常用操作:获取元素的命名空间URI、命名空间Prefix等。

判断元素是否有某个属性。

删除或替换子元素等。

使用DOM4J时,建议查阅官方文档或相关教程,以了解更多关于Element 和其它相关功能的详细信息。

java如何解析http请求返回的xml报文

java如何解析http请求返回的xml报文

java如何解析http请求返回的xml报⽂xml报⽂解析⽅法有很多种,此处采⽤dom4j的⽅法。

dom4j的jar包下载地址:https://dom4j.github.io/#1、request.getInputStream()和new SAXReader().read(输⼊流):返回的报⽂如下:<?xml version="1.0" encoding="UTF-8"?><CreateAccessKeyResponse> <CreateAccessKeyResult> <AccessKey> <UserName>aaa</UserName> <AccessKeyId>2019dfc6ab5fe433f10c</AccessKeyId> <Status>Active</Status> <IsPrimary>false</IsPrimary> <SecretAccessKey>a14aeb3ac35b835d5ec4507d5667a353c77ceedc</SecretAccessKey></AccessKey></CreateAccessKeyResult></CreateAccessKeyResponse>获取参数AccessKeyId的值:import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;HttpURLConnection conn = create_AccessKey(); //create_AccessKey为⾃⼰写的http请求⽅法// 从request中取得输⼊流InputStream inputStream = conn.getInputStream();// 读取输⼊流SAXReader reader = new SAXReader();Document document = reader.read(inputStream);// 得到xml根元素Element root = document.getRootElement();String AK = root.element("CreateAccessKeyResult").element("AccessKey").element("AccessKeyId").getTextTrim();System.out.println("AccessKeyId="+AK+"\n");2、⽤dom4j读取xml⽂件中的参数:public void readXml() throws DocumentException, FileNotFoundException, IOException {String xml =System.getProperty("user.dir")+File.separator+"src"+File.separator+"test"+File.separator+"java"+File.separator+"http"+File.separator+"config.xml"; File xmlFile = new File(xml);SAXReader reader = new SAXReader();try {Document document = reader.read(xmlFile);Element root = document.getRootElement();AK = root.element("ak").getTextTrim();SK = root.element("sk").getTextTrim();} catch (Exception e) {e.printStackTrace();}}config.xml的内容如下:<?xml version="1.0" encoding="UTF-8"?><configuration> <ak>0d34d3db4bab560d343c</ak> <sk>a52628cb22b5a12642dd907075df6996b4c8a7b1</sk></configuration>。

Dom4J解析xml文件动态转换为ListBean或者Map集合

Dom4J解析xml文件动态转换为ListBean或者Map集合

Dom4J解析xml⽂件动态转换为ListBean或者Map集合⼤家在解析⼤量相似xml⽂件的时候是否会遇到这样⼀个问题:冗余的代码去set定义的实体对象Bean的值,基本都是⼀样的操作⽽且毫⽆任何代码价值可⾔所以在这写了⼀个简单的例⼦,类封装了⼏个⽅法你只需传⼊xml⽂件,或者URL路径。

和Bean.Class 类名即可⾃动传回你需要的List集合。

需要解析的xml⽂件<?xml version="1.0" encoding="UTF-8"?><messages><resultCode>0</resultCode><totalCount>2</totalCount><UserLists><UserList><userId>0</userId><loginName>张三0</loginName><email>qsina0@</email><userType>1</userType><status>1</status><roleType>1</roleType><registerIP>192.168.1.0</registerIP><registerTime>2012-06-07 15:35:33</registerTime></UserList><UserList><userId>1</userId><loginName>张三1</loginName><email>qsina1@</email><userType>1</userType><status>1</status><roleType>1</roleType><registerIP>192.168.1.1</registerIP><registerTime>2012-06-07 15:35:33</registerTime></UserList></UserLists></messages>在进⾏相关操作中需要如下包:下⾯是贴出的代码:package mon.util;import ng.reflect.Field;import .URL;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class XmlParseUtil {/*** 反射设置实体不同类型字段的值 <暂时只⽀持⽇期字符串 boolean Integer值设置待扩建>** @param field* @param obj* @param value* @throws Exception*/public static void convertValue(Field field, Object obj, String value)throws Exception {SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");if (field.getGenericType().toString().equals("class ng.Integer")) {field.set(obj, Integer.parseInt(value));} else if (field.getGenericType().toString().equals("boolean")) {field.set(obj, Boolean.parseBoolean(value));} else if (field.getGenericType().toString().equals("class java.util.Date")) {field.set(obj, sim.parse(value));} else {field.set(obj, value);}}/*** 解析xml⽂件返回保存cls的List集合,如果返回码resultCode=1时则返回List为null** @param xml* @param cls* @return* @throws Exception*/@SuppressWarnings("unchecked")public static List<?> parseXml2List(String xml, Class<?> cls)throws Exception {List<Object> lists = null;Document doc = DocumentHelper.parseText(xml);Element et = doc.getRootElement();String root = et.getName();// 查看返回码是否为真.List<Element> list = doc.selectNodes("//" + root + "/resultCode");if (!list.isEmpty() && list.size() > 0) {Element element = list.get(0);String returnResult = element.getText();if (returnResult.equals("0")) {List<Element> father = doc.selectNodes("//" + root + "/"+ cls.getSimpleName()+"s"); //判断对象⽗节点是否有包含数据if(father!=null&&!father.isEmpty()&&father.size()==1){List<Element> userLists = father.get(0).elements();if (userLists!=null&&!list.isEmpty()) {lists = new ArrayList<Object>();for (Element e : userLists) {List<Element> li = e.elements();Class<?> cl = (Class<?>) Class.forName(cls.getName());Object ob = cl.newInstance();for (Element element2 : li) {String name = element2.getName();String value = element2.getText();Field field = ob.getClass().getDeclaredField(name);field.setAccessible(true);convertValue(field, ob, value);}lists.add(ob);}}}}}return lists;}/*** 解析xml⽂件返回保存cls的List集合,如果返回码resultCode=1时则返回List为null** @param url* @param cls* @return* @throws Exception*/@SuppressWarnings("unchecked")public static List<?> parseXml2List(URL url, Class<?> cls)throws Exception {List<Object> lists = null;SAXReader saxReader = new SAXReader();Document doc = saxReader.read(url);Element et = doc.getRootElement();String root = et.getName();// 查看返回码是否为真.List<Element> list = doc.selectNodes("//" + root + "/resultCode");if (!list.isEmpty() && list.size() > 0) {Element element = list.get(0);String returnResult = element.getText();if (returnResult.equals("0")) {List<Element> father = doc.selectNodes("//" + root + "/"+ cls.getSimpleName()+"s");//判断对象⽗节点是否有包含数据if(father!=null&&!father.isEmpty()&&father.size()==1){List<Element> userLists = father.get(0).elements();if (userLists!=null&&!list.isEmpty()) {lists = new ArrayList<Object>();for (Element e : userLists) {List<Element> li = e.elements();Class<?> cl = (Class<?>) Class.forName(cls.getName());Object ob = cl.newInstance();for (Element element2 : li) {String name = element2.getName();String value = element2.getText();Field field = ob.getClass().getDeclaredField(name);field.setAccessible(true);convertValue(field, ob, value);}lists.add(ob);}}}}}return lists;}/*** 解析xml⽂件返回保存Map的集合,map中可能包含key值为returnCode、desc、totalCount等单字段. * 也可能包含存储对象为List<cls>的集合值.* 获取List值key cls_List* @param requestPath* @param cls* @return map* @throws Exception*/@SuppressWarnings("unchecked")public static Map<String, Object> parseXml2Map(String requestPath,Class<?> cls) throws Exception {Map<String, Object> maps = new HashMap<String, Object>();List<Object> lists = new ArrayList<Object>();SAXReader saxReader = new SAXReader();//Document doc = saxReader.read(new File(requestPath));Document doc = saxReader.read(new URL(requestPath));Element et = doc.getRootElement();// 标记List是否为空// boolean bool = true ;// 根节点名字List<Element> rList = et.elements();for (Element element : rList) {List<Element> rLists = element.elements();if (!rLists.isEmpty() && rLists.size() > 0) {//bool = false;// 判断⼆级节点for (Element e : rLists) {List<Element> li = e.elements();Class<?> cl = (Class<?>) Class.forName(cls.getName()); Object ob = cl.newInstance();for (Element element2 : li) {String name = element2.getName();String value = element2.getText();Field field = ob.getClass().getDeclaredField(name);field.setAccessible(true);convertValue(field, ob, value);}lists.add(ob);}} else {maps.put(element.getName(), element.getText());}maps.put(cls.getSimpleName() + "_List", lists);}return maps;}/*** 只获取返回码0为保存成功(true)1为保存失败(false)*/@SuppressWarnings("unchecked")public static boolean parseXmlReturnCode(String xml) {boolean bool = false;try {Document doc = DocumentHelper.parseText(xml);Element et = doc.getRootElement();String root = et.getName();// 查看返回码是否为真.List<Element> list = doc.selectNodes("//" + root + "/resultCode"); if (!list.isEmpty() && list.size() > 0) {Element element = list.get(0);String returnResult = element.getText();if (returnResult.equals("0")) {bool = true;}}} catch (Exception e) {e.printStackTrace();}return bool;}}。

JavaXML解析的四种方法(连载)

JavaXML解析的四种方法(连载)

JavaXML解析的四种⽅法(连载)1. xml简介 XML:指可扩展标记语⾔, Extensible Markup Language;类似HTML。

XML的设计宗旨是传输数据,⽽⾮显⽰数据。

⼀个xml⽂档实例:1 <?xml version="1.0" encoding="UTF-8"?>2 <company name="Tencent" address="深圳市南⼭区">3 <department deptNo="001" name="development">4 <employee id="devHead" position="minister">许刚</employee>5 <employee position="developer">⼯程师A</employee>6 </department>7 <department deptNo="002" name="education">8 <employee position="minister" telephone="1234567">申林</employee>9 <employee position="trainee">实习⽣A</employee>10 </department>11 </company> 第⼀⾏是 XML 声明。

它定义 XML 的版本 (1.0) 和所使⽤的编码. 下⼀⾏描述⽂档的根元素:<company>开始,该根元素具有2个属性“name”,"address"。

DOM4J详细教程

DOM4J详细教程

DOM4J详细教程
答:
DOM4J是一个Java XML API,它可以用来快速、高效地读取、生成和
修改XML数据。

它支持XPath的完整实现,支持Java5的新功能,并有一
个强大的可扩展的SAX集成,还支持JAXP 1.3、通过支持性能良好的DOM、SAX以及JAXP的结合,它可以提供XML文档的可用性。

1.使用DOM4J
使用DOM4J解析XML文档的主要步骤如下:
(1)创建一个Document对象,该文档对象将描述整个XML文档。

(2)创建一个XMLReader对象,该对象使用DOM4J的API来解析
XML文档。

(3)创建一个DocumentHandler对象,该对象用来处理XML文档内容,如处理XML文档的根元素和子元素等。

(4)使用XMLReader的parse方法来将Document对象与DocumentHandler对象相关联,以便允许访问Document对象的内容。

(5)执行任何必要的处理来解析XML文档中的元素。

2.DOM4J技术
(1)XML读取
DOM4J提供了一组API,可以在处理XML文档时使用。

DOM4J的
org.dom4j.io.XMLReader类可以解析XML文档,将其转换为DOM4J的
Document对象。

它可以使用InputSource或java.io.Reader对象的任何对象,以确保可以将XML文档从字符串、文件或URL读取。

(2)XML写入
(3)XPath查询。

dom4j下载与使用文档

dom4j下载与使用文档

Dom4j下载及使用Dom4j读写XML简介要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在/目前最新dom4j包下载地址:/sourceforge/dom4j/dom4j-1.6.1.zip解开后有两个包,仅操作XML文档的话把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的话还需要加入包jaxen-1.1-beta-7.jar.以下是相关操作:一.Document对象相关1.读取XML文件,获得document对象.SAXReader reader = new SAXReader();Document document = reader.read(new File("input.xml"));2.解析XML形式的文本,得到document对象.String text = "<members></members>";Document document = DocumentHelper.parseText(text);3.主动创建document对象.Document document = DocumentHelper.createDocument();Element root = document.addElement("members");// 创建根节点二.节点相关1.获取文档的根节点.Element rootElm = document.getRootElement();2.取得某节点的单个子节点.Element memberElm=root.element("member");// "member"是节点名3.取得节点的文字String text=memberElm.getText();也可以用:String text=root.elementT ext("name");这个是取得根节点下的name字节点的文字.4.取得某节点下名为"member"的所有字节点并进行遍历.List nodes = rootElm.elements("member");for (Iterator it = nodes.iterator(); it.hasNext();) {Element elm = (Element) it.next();// do something}5.对某节点下的所有子节点进行遍历.for(Iterator it=root.elementIterator();it.hasNext();){Element element = (Element) it.next();// do something}6.在某节点下添加子节点.Element ageElm = newMemberElm.addElement("age");7.设置节点文字.ageElm.setText("29");8.删除某节点.parentElm.remove(childElm);// childElm是待删除的节点,parentElm是其父节点三.属性相关.1.取得某节点下的某属性Element root=document.getRootElement();Attribute attribute=root.attribute("size");// 属性名name2.取得属性的文字String text=attribute.getText();也可以用:String text2=root.element("name").attributeValue("firstname");这个是取得根节点下name字节点的属性firstname的值.3.遍历某节点的所有属性Element root=document.getRootElement();for(Iterator it=root.attributeIterator();it.hasNext();){Attribute attribute = (Attribute) it.next();String text=attribute.getText();System.out.println(text);}4.设置某节点的属性和文字.newMemberElm.addAttribute("name", "sitinspring");5.设置属性的文字Attribute attribute=root.attribute("name");attribute.setText("sitinspring");6.删除某属性Attribute attribute=root.attribute("size");// 属性名nameroot.remove(attribute);四.将文档写入XML文件.1.文档中全为英文,不设置编码,直接写入的形式.XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));writer.write(document);writer.close();2.文档中含有中文,设置编码格式写入的形式.OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("GBK"); // 指定XML编码XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);writer.write(document);writer.close();五.字符串与XML的转换1.将字符串转化为XMLString text = "<members> <member>sitinspring</member> </members>";Document document = DocumentHelper.parseText(text);2.将文档或节点的XML转化为字符串.SAXReader reader = new SAXReader();Document document = reader.read(new File("input.xml"));Element root=document.getRootElement();String docXmlText=document.asXML();String rootXmlText=root.asXML();Element memberElm=root.element("member");String memberXmlText=memberElm.asXML();六.使用XPath快速找到节点.读取的XML文档示例<?xml version="1.0" encoding="UTF-8"?><projectDescription><name>MemberManagement</name><comment></comment><projects><project>PRJ1</project><project>PRJ2</project><project>PRJ3</project><project>PRJ4</project></projects><buildSpec><buildCommand><name>org.eclipse.jdt.core.javabuilder</name><arguments></arguments></buildCommand></buildSpec><natures><nature>org.eclipse.jdt.core.javanature</nature></natures></projectDescription>使用XPath快速找到节点project.public static void main(String[] args){SAXReader reader = new SAXReader();try{Document doc = reader.read(new File("sample.xml"));List projects=doc.selectNodes("/projectDescription/projects/project"); Iterator it=projects.iterator();while(it.hasNext()){Element elm=(Element)it.next();System.out.println(elm.getText()); }}catch(Exception ex){ex.printStackTrace();}}。

jdom

jdom


获取元素对象中的文本 //获取element元素的内部文本 String text = element.getText(); //获取element子元素内部文本 String text = element.elementText(“子元素名称”);
XML文档基本操作——Attribute
获取元素属性对象
//创建document对象
Document doc = builder.build(url);
JDOM的主要方法使用(三)
XML文档输出 XMLOutPutter类:JDOM的输出非常灵活,支持 很多种io格式以及风格的输出 XMLOutputter out = new XMLOutputter(); out.output(doc, fileOutputStream);
root.setText("Hello JDOM!"); 或者简单的使用 Document doc = new Document(new Element("GREETING").setText("Hello JDOM! "));
JDOM的主要方法使用(二)
从文件、流、系统ID、URL得到Document对象:
//通过属性名获取元素属性对象
Attribute attribute = element.attribute(“属性名称");
//通过索引获取属性对象
Attribute attribute = element.attribute(0);
//获取所有属性对象集合
List attributeList = root.attributes();
JDOM的主要方法使用(一)
Ducument类 Document的操作方法:

xml的四种解析方法及源代码

xml的四种解析方法及源代码

xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)第二种:DOM解析DOM中的核心概念就是节点。

DOM在分析XML文档时,将将组成XML文档的各个部分(元素、属性、文本、注释、处理指令等)映射为一个对象(节点)。

在内存中,这些节点形成一课文档树。

整棵树是一个节点,树中的每一个节点也是一棵树(子树),可以说,DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。

PS:属性节点是附属于元素的,不能被看做是元素的子节点,更不能作为一个单独的节点DOMPrinter.javaJava代码import org.w3c.dom.Document;import dNodeMap;import org.w3c.dom.Node;import .apache.xerces.internal.parsers.DOMParser;public class DOMPrinter{public static void main(String[] args){try{/** *//** 获取Document对象 */DOMParser parser = new DOMParser();parser.parse("db.xml");Document document = parser.getDocument();printNode(document);} catch (Exception e){e.printStackTrace();}}public static void printNode(Node node){short nodeType=node.getNodeType();switch(nodeType){case Node.PROCESSING_INSTRUCTION_NODE://预处理指令类型 printNodeInfo(node);break;case Node.ELEMENT_NODE://元素节点类型printNodeInfo(node);printAttribute(node);break;case Node.TEXT_NODE://文本节点类型printNodeInfo(node);break;default:break;}Node child=node.getFirstChild();while(child!=null){printNode(child);child=child.getNextSibling();}}/** *//*** 根据节点类型打印节点* @param node*/public static void printNodeInfo(Node node){if (node.getNodeType() == Node.ELEMENT_NODE){System.out.println("NodeName: " + node.getNodeName()); }else if (node.getNodeType() == Node.TEXT_NODE){String value = node.getNodeValue().trim();if (!value.equals(""))System.out.println("NodeValue: " + value);elseSystem.out.println();}else{System.out.println(node.getNodeName()+" : "+node.getNodeValu e());}}/** *//*** 打印节点属性* @param aNode 节点*/public static void printAttribute(Node aNode){NamedNodeMap attrs = aNode.getAttributes();if(attrs!=null){for (int i = 0; i < attrs.getLength(); i++){Node attNode = attrs.item(i);System.out.println("Attribute: " + attNode.getNodeName() + "=\"" + attNode.getNodeValue()+"\"");}}}DOM生成XML文档:DOMCreateExample.javaJava代码import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import .apache.xml.internal.serialize.XMLSerializer;public class DOMCreateExample{public static void main(String[] args) throws ParserConfiguratio nException{//DOMImplementation domImp = DOMImplementationImpl.getDOMImple mentation();DocumentBuilderFactory builderFact = DocumentBuilderFactory.ne wInstance();DocumentBuilder builder = builderFact.newDocumentBuilder();Document doc = builder.newDocument();//Document doc = domImp.createDocument(null, null, null);Element root = doc.createElement("games");Element child1 = doc.createElement("game");child1.appendChild(doc.createTextNode("Final Fantasy VII")); child1.setAttribute("genre", "rpg");root.appendChild(child1);doc.appendChild(root);XMLSerializer serial;try{serial = new XMLSerializer(new FileOutputStream("domcreate.x ml"), null);serial.serialize(doc);} catch (FileNotFoundException e1){e1.printStackTrace();} catch (IOException e){e.printStackTrace();}}}第三种JDOM解析JDOM利用了java语言的优秀特性,极大地简化了对XML文档的处理,相比DOM 简单易用。

读取xml的五种方法

读取xml的五种方法
123 * @param qName 原始名,如LIT:student
124 * @throws SAXException */
125 public void endElement(String namespaceURI, String localName,String qName) throws SAXException{
28 System.exit(1);
29 }
30 //获得根节点StuInfo
31 Element elmtStuInfo = doc.getDocumentElement();
32 //得到所有student节点
33 NodeList nlStudent = elmtStuInfo.getElementsByTagNameNS(
23 } catch (DOMException dom) {
24Message());
25 System.exit(1);
26 } catch (IOException ioe) {
27 System.err.println(ioe);
在java环境下读取xml文件的方法主要有5种:DOM、SAX、JDOM、JAXB、dom4j
最常用、最好用的dom4j
1. DOM(Document Object Model)
此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接沿袭了 XML 规范。每个结点都可以扩展的基于 Node 的接口,就多态性的观点来讲,它是优秀的,但是在 Java 语言中的应用不方便,并且可读性不强。

JAVA 解析XML 文件的三种解析方法

JAVA 解析XML 文件的三种解析方法

创建解析XML文件的三种解析方法1、第一种用w3c解析package w3c;import java.io.File;import java.io.FileOutputStream;import java.util.Random;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class w3c {public static void main(String[] args) throws Exception{ createXml();}//创建XML文档并创建节点public static void createXml() throws Exception{//获取XML解析器工厂类DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//获取XML解析器DocumentBuilder db = dbf.newDocumentBuilder();//获取操作的document对象Document document = db.newDocument();//设置XML文件的版本document.setXmlVersion("1.0");//创建根节点Element root = document.createElement("students");//将根节点添加到document对象中document.appendChild(root);//声明一个姓名的数组String nameList[] = {"吕布","赵云","马超","张飞","关羽","许褚","孙策","周瑜","夏侯渊","张颌","于禁","黄忠","典韦","曹仁","程普"};String sexList[] = {"男","女"};//循环添加数据for(int i = 0 ;i < 20 ; i++){//创建根元素节点Element rootelement = document.createElement("student");//声明参数IDString id ="";//循环生成一个9为的随机ID数for(int j = 0; j< 9 ; j ++ ){id += new Random().nextInt(8)+1;}//设置根元素节点的属性rootelement.setAttribute("id",id);//将根元素节点添加到根节点中root.appendChild(rootelement);//设置元素节点Element name = document.createElement("name");Element sex = document.createElement("sex");Element age = document.createElement("age");Element phone = document.createElement("phone");//给元素节点赋值name.setTextContent(nameList[newRandom().nextInt(nameList.length)]);sex.setTextContent(sexList[newRandom().nextInt(sexList.length)]);age.setTextContent(new Random().nextInt(20)+20+"");String tel ="";for(int k = 0; k< 7 ; k++ ){tel += new Random().nextInt(9);}phone.setTextContent("0756-"+tel);//将元素节点添加到根元素节点中rootelement.appendChild(name);rootelement.appendChild(sex);rootelement.appendChild(age);rootelement.appendChild(phone);}//开始把Document映射到文件TransformerFactory transFactory =TransformerFactory.newInstance();Transformer transFormer = transFactory.newTransformer();//生成的XML文件File file = new File("w3c.xml");//判断XML文件存不存在,如果不存在则创建if(file.exists()){file.createNewFile();}//设置是否添加空格transFormer.setOutputProperty(OutputKeys.INDENT, "yes");//设置输出文件的格式transFormer.setOutputProperty(OutputKeys.ENCODING, "utf-8");//输出XML文件transFormer.transform(new DOMSource(document), newStreamResult(new FileOutputStream(file)));//输出XML文件的路径System.out.println(file.getAbsolutePath());}//解析XML文档public static void resolving() throws Exception{//获取XML解析器工厂类DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//获取XML解析器DocumentBuilder db = dbf.newDocumentBuilder();//获取操作的document对象Document document = db.parse(new File("w3c.xml"));//获取XML文件的根元素节点NodeList root = document.getElementsByTagName("student");//循环根元素节点信息for(int i = 0 ; i < root.getLength() ;i++){Element student = (Element)root.item(i);System.err.println("id = "+student.getAttribute("id")+" name = "+student.getElementsByTagName("name").item(0).getTextContent()+" sex = "+student.getElementsByTagName("sex").item(0).getTextContent()+" age = "+student.getElementsByTagName("age").item(0).getTextContent()+" phone = "+student.getElementsByTagName("phone").item(0).getTextContent());}}}2、第二种用jdom解析package jdom;import java.io.FileOutputStream;import java.util.Iterator;import java.util.List;import java.util.Random;import org.jdom.Document;import org.jdom.Element;import org.jdom.input.SAXBuilder;import org.jdom.output.Format;import org.jdom.output.XMLOutputter;public class jdom {private static String xmlpath = "jdom.xml";public static void main(String[] args) throws Exception{ //resolving();createXml();}//创建XML文件并添加节点public static void createXml() throws Exception{ //创建document对象Document document = new Document();//创建根节点Element root = new Element("students");//将根节点添加到document对象中document.addContent(root);for(int i = 0 ;i < 20 ; i++){//创建根元素节点Element student = new Element("student");//声明参数IDString id ="";//循环生成一个9为的随机ID数for(int j = 0; j< 9 ; j ++ ){id += new Random().nextInt(8)+1;}//设置跟元素节点的属性student.setAttribute("id",id);//将根元素节点添加到根节点中root.addContent(student);//声明一个姓名的数组String nameList[] = {"吕布","赵云","马超","张飞","关羽","许褚","孙策","周瑜","夏侯渊","张颌","于禁","黄忠","典韦","曹仁","程普"};String sexList[] = {"男","女"};//创建元素节点Element name = new Element("name");Element sex = new Element("sex");Element age =new Element("age");Element phone = new Element("phone");//设置根元素节点的文本值name.setText(nameList[newRandom().nextInt(nameList.length)]);sex.setText(sexList[new Random().nextInt(sexList.length)]);age.setText(new Random().nextInt(20)+20+"");String tel ="";for(int k = 0; k< 7 ; k++ ){tel += new Random().nextInt(9);}phone.setText("0756-"+tel);//将元素节点添加到根元素节点中student.addContent(name);student.addContent(sex);student.addContent(age);student.addContent(phone);}//设置XML输出排版Format format = Format.getPrettyFormat();XMLOutputter out = new XMLOutputter(format);//输出XML文件out.output(document, new FileOutputStream(xmlpath));}//解析XML文档@SuppressWarnings("rawtypes")public static void resolving() throws Exception{//获取XML解析器SAXBuilder builder = new SAXBuilder();//获取document对象Document doucment = builder.build(xmlpath);//获取根节点Element students = doucment.getRootElement();//获取根元素节点List studentList = students.getChildren("student");//循环获取元素文本值,第一种方法for(int i = 0 ; i< studentList.size() ; i++ ){Element student = (Element)studentList.get(i);System.out.println("id ="+student.getAttributeValue("id")+" name = "+student.getChildText("name")+" sex = "+student.getChildText("sex")+" age = "+student.getChildText("age")+" phone = "+student.getChildText("phone"));}System.err.println("\n---------------------------------------------------------------------");//循环获取元素文本值,第二种方法for(Iterator iter=studentList.iterator();iter.hasNext();){ Element student = (Element)iter.next();System.out.println("id ="+student.getAttributeValue("id")+" name = "+student.getChildText("name")+" sex = "+student.getChildText("sex")+" age = "+student.getChildText("age")+" phone = "+student.getChildText("phone"));}}}3、第三种用dom4j解析package dom4j;import java.io.File;import java.io.FileWriter;import java.util.Iterator;import java.util.List;import java.util.Random;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class dom4j {private static String xmlpath = "dom4j.xml";public static void main(String[] args)throws Exception{//createXml();resolving();}public static void createXml() throws Exception{//创建document对象Document document = DocumentHelper.createDocument();//创建根节点Element root = DocumentHelper.createElement("studnets");//将根节点添加到document对象中document.setRootElement(root);for(int i = 0 ;i < 20 ; i++){//创建根元素节点并将根元素节点添加到根节点中Element student = root.addElement("student");//设置根元素节点的值//声明参数IDString id ="";//循环生成一个9为的随机ID数for(int j = 0; j< 9 ; j ++ ){id += new Random().nextInt(8)+1;}student.addAttribute("id",id);//创建元素节点并将元素节点添加到根元素节点中Element name = student.addElement("name");Element sex = student.addElement("sex");Element age = student.addElement("age");Element phone = student.addElement("phone");//声明一个姓名的数组String nameList[] = {"吕布","赵云","马超","张飞","关羽","许褚","孙策","周瑜","夏侯渊","张颌","于禁","黄忠","典韦","曹仁","程普"};String sexList[] = {"男","女"};//设置元素节点的文本值name.setText(nameList[newRandom().nextInt(nameList.length)]);sex.setText(sexList[new Random().nextInt(sexList.length)]);age.setText(new Random().nextInt(20)+20+"");String tel ="";for(int k = 0; k< 7 ; k++ ){tel += new Random().nextInt(9);}phone.setText("0756-"+tel);}//设置XML文件输出的格式OutputFormat format = new OutputFormat("\t", true);format.setEncoding("utf-8");XMLWriter xmlWriter = new XMLWriter(new FileWriter(xmlpath), format);//输出XML文件xmlWriter.write(document);xmlWriter.close();}//解析XML文件@SuppressWarnings("rawtypes")public static void resolving() throws Exception{//获取XML解析器SAXReader saxReader = new SAXReader();//获取document对象Document document = saxReader.read(new File(xmlpath));//获取根节点Element root = document.getRootElement();//获取根元素节点List chindList = root.elements();//循环获取元素文本值,第一种方法for(Iterator iter = chindList.iterator(); iter.hasNext();){ Element student =(Element)iter.next();System.out.println("id = "+student.attributeValue("id")+" name = "+student.elementText("name")+" sex = "+student.elementText("sex")+" age = "+student.elementText("age")+" phone = "+student.elementText("phone"));}System.err.println("\n---------------------------------------------------------------------");//循环获取元素文本值,第二种方法for(int i = 0 ; i< chindList.size() ; i++ ){Element student = (Element)chindList.get(i);System.out.println("id = "+student.attributeValue("id")+" name = "+student.elementText("name")+" sex = "+student.elementText("sex")+" age = "+student.elementText("age")+" phone = "+student.elementText("phone"));}}}。

DOM4j解析技术探究

DOM4j解析技术探究
<e mply e > oes
< mpo e > e ly e
( ) 人 D M j P 所 在 的 jr , i p r og 1导 O 4AI a 包 即 m ot r.
d m4. o j ( ) 建 文 档 Do u n 对 象 2创 c me t 在 DO j I中 . 以使 用 D c me t le 类 或 M4 AP 可 o u nHep r
在 该 结 构 图 中 . it 就 是 访 问者 抽 象 类 . 这 个 V so ir 在
类 中 .为 该 对 象 结 构 中 的 C n rtE e n 的 每 一 个 类 o cee lme t
为 了添 加 该 指 令 节 点 . 以 利 用 D C m n 接 口中 可 OU et
的 a d rc sign t t n ) 法 。若 要 生 成 如 上 所 述 d Po es lsmci ( 方 n o 的 指 令 节 点 则 可 以 用 以 下 写 法 . 即 d ca d rc si o .d Po e s n
CD ATA
1e t Co m e ’x m nt
£ 一 ~。
口继 承 关 系
图1 O j D M4 ̄
sxdi r 置 解 析 器 . O j 会 使 用 J X a. v 设 re D M4 将 A P来 加 载 JX A P配 置 的 解 析 器 : 果 创 建 失 败 . 使 用 A le2 如 则 e rd f
作 用 。利 用 解 析 器 可 以对 X ML文 档 进 行 解 析 、 询 以 查 及 增 删 改 等 操 作
1 D OM4 解 析 器 简 介 i
X ML解 析器 提 供 了 A I P. 我们 的应 用 程序 可 以通 过

dom4j解析XML文档

dom4j解析XML文档

将dom4j-1.6.1.jar添加到系统CLASSPATH环境变量中
Dom4j常用的API 【重点掌握】
Element Branch Document
Cloneable
Node
Attribute
DocumentType
CharacterData
ProcessingInstruction
CDATA
<list> <book>疯狂XML讲义</book> <game>扫雷</game> <sport>乒乓球</sport> </list>
在获取<list…/>节点之后,如果希望获取它包含的3个子节点的数 节点之后,如果希望获取它包含的 个子节点的数 在获取 节点之后 据,需要使用如下代码
//获取list元素下的所有子元素 NodeList itemList=list.getChildNodes(); //遍历每个子元素 for(int I=0;I<itemList.getLength();I++){ System.out.println(itemList.item(j).getTextContent().trim()); }
Vistor接口的方法
visit(Attribute node) visit(CDATA node)
简单说明
当Visitor对象访问属性节点时将回调该方法 当Visitor对象访问CDATA片段时将回调该方法 当Visitor对象访问注释节点时将回调该方法 当Visitor对象访问文档根节点时将回调该方法 当Visitor对象访问DTD内容将回调该方法 当Visitor对象访问元素节点将回调该方法 当Visitor对象访问Entity节点将回调该方法 当Visitor对象访问命名空间时回调该方法 当Visitor对象访问处理指令时回调该方法 当Visitor对象访问文档内容时将回调该方法

Dom4j 1.6.1 操作XML初始教程

Dom4j 1.6.1 操作XML初始教程

Dom4j 1.6.1 初始教程Dom4j是什么DD?dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。

dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。

在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。

如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。

这是必须使用的jar包,Hibernate用它来读写配置文件dom4j需要导入dom4j-full.jar包.Dom4j家庭成员主要API都在org.dom4j这个包里定义:1.Attribute Attribute定义了XML的属性2.Branch Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为,3.CDATA CDATA 定义了XML CDATA 区域4.CharacterData CharacterData是一个标识借口,标识基于字符的节点。

如CDATA,Comment, Text.5. Comment Comment 定义了XML注释的行为6. Document 定义了XML文档7.DocumentType DocumentType 定义XML DOCTYPE声明8. Element Element定义XML 元素9. ElementHandler ElementHandler定义了Element 对象的处理器10. ElementPath 被ElementHandler 使用,用于取得当前正在处理的路径层次信息11. Entity Entity定义XML entity12. Node Node为所有的dom4j中XML节点定义了多态行为13. NodeFilter NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)14. ProcessingInstruction ProcessingInstruction 定义XML 处理指令.15. Text Text 定义XML 文本节点.16. Visitor Visitor 用于实现Visitor模式.17. XPath XPath 在分析一个字符串后会提供一个XPath 表达式Dom4j如何干活?1.利用dom4j创建一个XML文件:view plaincopy to clipboardprint?package com.xml;import java.io.FileWriter;import java.io.IOException;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;public class CreateXML {public static void main(String[] args) {XMLWriter writer = null;try {// 1.document构建器Document doc = DocumentHelper.createDocument();// 2.添加元素(根)Element students = doc.addElement("students");Element student1 = students.addElement("student");// 添加属性;student1.addAttribute("stuno", "s001");// 添加子元素student1.addElement("stuname").setText("刘光蓝");student1.addElement("stusex").setText("男");student1.addElement("stuage").setText("25");//设置输出格式OutputFormat format=OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");writer = new XMLWriter(new FileWrite("d:/student.xml"),format);writer.write(doc);System.out.println("生成XML成功!");} catch (Exception e) {e.printStackTrace();} finally {try {writer.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}package com.xml;import java.io.FileWriter;import java.io.IOException;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;public class CreateXML {public static void main(String[] args) {XMLWriter writer = null;try {// 1.document构建器Document doc = DocumentHelper.createDocument();// 2.添加元素(根)Element students = doc.addElement("students");Element student1 = students.addElement("student");// 添加属性;student1.addAttribute("stuno", "s001");// 添加子元素student1.addElement("stuname").setText("刘光蓝");student1.addElement("stusex").setText("男");student1.addElement("stuage").setText("25");//设置输出格式OutputFormat format=OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");writer = new XMLWriter(new FileWrite("d:/student.xml"),format); writer.write(doc);System.out.println("生成XML成功!");} catch (Exception e) {e.printStackTrace();} finally {try {writer.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}2.利用dom4j读取一个XML文件:view plaincopy to clipboardprint?01.package com.xml;02.03.import java.io.File;04.import java.util.List;05.06.import org.dom4j.Document;07.import org.dom4j.Element;08.import org.dom4j.Node;09.import org.dom4j.io.SAXReader;10.11.public class ReaderXML {12. public static void main(String[] args) {13. try {14. SAXReader saxReader=new SAXReader();15. Document doc=saxReader.read(new File("d:/student.xml"));16. //利用XPath来访问元素,属性17. // /students/student[1] 指定某个元素18. // /students/student/@stuno指定某个属性19. // /students/student[@stuno='s002']做判断20. List<Node> data=doc.selectNodes("/students/student");21. for(Node node:data){22. //node.asXML() 以字符串的格式打印XML23. if("Element".equals(node.getNodeTypeName())){24. Element element=(Element)node;25. //读取属性值26. System.out.println(element.attributeValue("stuno"));27. //读取子元素文本值28. System.out.println(element.elementText("stuname"));29. System.out.println(element.elementText("stusex"));30. System.out.println(element.elementText("stuage")+"\n");31. }32. }33. } catch (Exception e) {34. e.printStackTrace();35. }36. }37.38.}package com.xml;import java.io.File;import java.util.List;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;public class ReaderXML {public static void main(String[] args) {try {SAXReader saxReader=new SAXReader();Document doc=saxReader.read(new File("d:/student.xml"));//利用XPath来访问元素,属性// /students/student[1] 指定某个元素// /students/student/@stuno指定某个属性// /students/student[@stuno='s002']做判断List<Node> data=doc.selectNodes("/students/student");for(Node node:data){//node.asXML() 以字符串的格式打印XMLif("Element".equals(node.getNodeTypeName())){Element element=(Element)node;//读取属性值System.out.println(element.attributeValue("stuno"));//读取子元素文本值System.out.println(element.elementText("stuname"));System.out.println(element.elementText("stusex"));System.out.println(element.elementText("stuage")+"\n");}}} catch (Exception e) {e.printStackTrace();}}}3.利用dom4j修改一个XML文件:view plaincopy to clipboardprint?01.package com.xml;02.03.import java.io.File;04.import java.io.FileWriter;05.import java.io.IOException;06.import java.util.List;07.08.import org.dom4j.Document;09.import org.dom4j.Element;10.import org.dom4j.Node;11.import org.dom4j.io.OutputFormat;12.import org.dom4j.io.SAXReader;13.import org.dom4j.io.XMLWriter;14.15.public class UpdateXMLData {16.17. public static void main(String[] args) {18. XMLWriter writer = null;19. try {20. SAXReader saxReader = new SAXReader();21. Document doc = saxReader .read(new File("d:/student.xml"));22. List<Node> data = doc23. .selectNodes("/students/student[@stuno='s002']");24. for (Node node : data) {25. if ("Element".equals(node.getNodeTypeName())) {26. Element temp = (Element) node;27. //修改student的stuno属性值28. temp.setAttributeValue("stuno", "stu002");29. }30. }31. OutputFormat format = OutputFormat.createPrettyPrint();32. format.setEncoding("UTF-8");33. writer = new XMLWriter(new FileWriter("d:/student.xml"), format);34. writer.write(doc);35. System.out.println("修改成功!");36. } catch (Exception e) {37. e.printStackTrace();38. } finally {39. try {40. writer.close();41. } catch (IOException e) {42. // TODO Auto-generated catch block43. e.printStackTrace();44. }45. }46.47. }48.49.}。

基于DOM4J的XML文档解析技术

基于DOM4J的XML文档解析技术
科技信息
计 算机 与 网络
基孑 D OM4 帕 XML文档翩析技Biblioteka J南京政 治学 院 肖 袁
[ 摘 要] 文介绍 了 DoM4产 生的背景和 DOM4 ̄ , 本 l J 并讨 论 了利用 X MLD0M4技术 来实现 动态地创建文档 , J 以及遍 历文档
结构 、 添加 、 修改、 文档 内容等 方法。 [ 关键词 ] DoM4 AP XML DOM S 『 I AX 随着 XML的 日益流行 , 各种数据 的存储 、 传输更 多的是 以 XML文 档的形式进行的。如何对这 些 XML文档进行解析 、 位 、 定 操作和查询来 满足用户的各种需求 , 以及将取得的资料做更进一步 的应用是 XML应 用开发者面临 的关键 问题 。 目前 已经 面世 的 xML 【 解析器有 : O D M、
it aeaaagCoebe ne c v. n.l a l f r j 1 n
itr c r.o j oe ne ae gdm4. d f o N it ae r. m j t b t ne c g o 4. t ue f r o d Ar i it ae r.o 4.r c ne c g m j a h f r o d B n itr c r.o j ou e t ne ae g m4. c m n f o d D itr c r.o j l n ne aeog m4. e t f d E me itfc r.o 5 hrceD t ne aeog m4. aatr a r d C a itr e r.o 4.D T nef e gdm j A A a o C itr c r.o j o met ne ae gdm4. m n f o C itr c r.o 4.et ne ae g m j x f o d T itr c r.o j ou e ty e ne aeog m4.c m nTp f d D

java xml 多层实体类实例

java xml 多层实体类实例

java xml 多层实体类实例摘要:1.Java DOM4j 解析XML 实例2.DOM4j 简介3.多层实体类实例4.解析XML 文档5.实体类转换为DOM4j 节点6.遍历和操作DOM4j 节点7.结论正文:1.Java DOM4j 解析XML 实例在Java 中,DOM4j 是一个常用的XML 解析库,它可以帮助我们方便地解析和操作XML 文档。

今天我们将通过一个多层实体类的实例来学习如何使用DOM4j 解析XML 文档。

2.DOM4j 简介DOM4j 是一个Java 库,它提供了对XML 文档的解析、操作和生成等功能。

与其他XML 解析库相比,DOM4j 具有体积小、解析速度快、支持XPath 等优点。

在官方下载dom4j-1.6.1.zip 解压后,我们可以把dom4j-1.6.1.jar 加入工程中使用。

3.多层实体类实例假设我们有如下一个多层实体类,用于表示一个公司的员工信息:```javapublic class Employee {private String name;private int age;private String position;private String department;// getter 和setter 方法省略}public class Company {private String name;private int number;private List<Employee> employees;// getter 和setter 方法省略}```4.解析XML 文档假设我们有如下一个XML 文档:```xml<company><name>ABC 公司</name><number>100</number><employees><employee><name>张三</name><age>25</age><position>软件工程师</position><department>第二部门</department></employee><employee><name>李四</name><age>30</age><position>测试工程师</position><department>第一部门</department></employee></employees></company>```我们可以使用DOM4j 解析此XML 文档,并生成对应的多层实体类对象。

org.dom4j.document 例子

org.dom4j.document 例子

主题:org.dom4j.document 例子org.dom4j是一个用于操作XML文档的开放源代码的Java库。

它提供了一种简单而灵活的方式来处理XML文档。

org.dom4j.document是其中的一个重要概念,本文将通过给出一个具体的例子来解释org.dom4j.document的使用方法。

在org.dom4j中,org.dom4j.Document类表示XML文档的顶层节点。

一个XML文档通常由一个根元素和若干个子元素组成,org.dom4j.Document类提供了丰富的方法来创建、访问和操作XML 文档。

下面我们将通过一个具体的例子来演示org.dom4j.document 的使用。

假设我们有一个简单的XML文档,内容如下:```xml<?xml version="1.0" encoding="UTF-8"?><bookstore><book category="children"><title lang="en">Harry Potter</title><author>J.K. Rowling</author><year>2005</year><price>29.99</price></book><book category="web"><title lang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book></bookstore>```我们想要使用org.dom4j.document来操作这个XML文档,首先需要创建一个Document对象。

Dom4J、JDOM、DOM、SAX和Pull技术解析XML文件

Dom4J、JDOM、DOM、SAX和Pull技术解析XML文件

解析XML文件的五种技术1.1SAX技术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解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

1.1.1 SAX语法简介SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。

SAX 解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Xml文件:<?xml version="1.0" encoding="UTF-8"?><student><!--first xml--><call show="no"><name>studentname</name><English>78</English><Chinese>78</Chinese><Japan>98</Japan></call><call show="no"><name>studentname</name><English>77</English><Chinese>68</Chinese><Japan>88</Japan></call></student>JAVA文件:import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;/***DOM4j对xml文件的操作*操作DOM4j的时候注意要导入3个jar包,否则会报异常*dom4j-1.6.1.jar*jaxen-1.1-beta-6.jar*saxpath.jar**/public class ReaderDom4j {/***创建一个xml文件**/public static void createxml() {//使用 DocumentHelper 类创建一个文档实例。

DocumentHelper 是生成 XML 文档节点的 dom4j API 工厂类。

Document document = DocumentHelper.createDocument();//使用 addElement() 方法创建根元素 studentElement booksElement = document.addElement("student");booksElement.addComment("first xml");//在 student 元素中使用 addElement() 方法增加 call 元素。

Element book1Elment = booksElement.addElement("call");//在call元素里增加show属性,show属性的值是yesbook1Elment.addAttribute("show", "yes");//在 call 元素中使用 addElement() 方法增加 name 元素。

Element book2Element = book1Elment.addElement("name");//设置name标签的内容book2Element.setText("zhangsan");Element book3Element = book1Elment.addElement("English");book3Element.setText("78");Element book4Element = book1Elment.addElement("Chinese");book4Element.setText("78");Element book5Element = book1Elment.addElement("Japan");book5Element.setText("98");book1Elment = booksElement.addElement("call");book1Elment.addAttribute("show", "yes");book2Element = book1Elment.addElement("name");book2Element.setText("wangwu");book3Element = book1Elment.addElement("English");book3Element.setText("77");book4Element = book1Elment.addElement("Chinese");book4Element.setText("68");book5Element = book1Elment.addElement("Japan");book5Element.setText("88");try {//格式化输出xml文件,兼容ie的格式化输出OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");//把xml文件从内存中写入文件XMLWriter writer = new XMLWriter(new FileWriter("myxml.xml"), format);writer.write(document);writer.close();} catch (IOException e) {e.printStackTrace();}}@SuppressWarnings("unchecked")/***对xml文件的修改操作*修改xml文件以后要重新把xml文件从内存中写入文件,否则修改的只是内存中的xml,实际文件不会改变*DOM4j操作xml文件是一次性把所有数据读入内存中,所以xml文件过大不能用dom4j去解析**/public static void modifyxml(){//使用SAXReader去解析xml文件SAXReader reader=new SAXReader();Document document;try {File file = new File("C:\\workspace\\Test\\myxml.xml");//获取document对象document=reader.read(file);//通过selectNodes寻找节点或者属性List list=document.selectNodes("/student/call/@show");Iterator it=list.iterator();while(it.hasNext()){//Attribute属性的操作方法Attribute attribute=(Attribute)it.next();if(attribute.getValue().equals("yes")){a ttribute.setValue("no");}}list =document.selectNodes("/student/call/name");it=list.iterator();while(it.hasNext()){//标签内容的操作方法Element nameElment=(Element)it.next();nameElment.setText("studentname");}//删除某个节点是要用两层循环,因为删除当前节点必须用父节点去删除。

list=document.selectNodes("/student/call");it=list.iterator();while(it.hasNext()){//获取父节点Element scoreElement=(Element)it.next();System.out.println(scoreElement);@SuppressWarnings("unused")//获取该父节点下面的需要查找的子节点Iterator itera=scoreElement.elementIterator("English");while(itera.hasNext()){Element scoreEnglish=(Element)itera.next();if(scoreEnglish.getText().equals("77")){//利用父节点去删除scoreElement.remove(scoreEnglish);}}}@SuppressWarnings("unused")/* Iteratoritera=document.getRootElement().elementIterator("call");while(itera.hasNext()){Element ele=(Element)itera.next();System.out.println(ele);}*/OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");XMLWriter writer;try {writer = new XMLWriter(new FileWriter("myxml.xml"),format);writer.write(document);writer.close();} catch (IOException e) {e.printStackTrace();}} catch (DocumentException e) {e.printStackTrace();}}public static void main(String args[]){ReaderDom4j.createxml();ReaderDom4j.modifyxml();}}总结如下:创建xml文件获取document对象Document document =DocumentHelper.createDocument();创建节点父节点.addElement(“子节点”);创建节点的内容节点.setText(“内容”);创建节点的属性及内容节点.addAttribute(“属性名”,”属性值”);修改xml的操作获取SAXReader的对象SAXReader reader=new SAXReader();获取document对象Document document=reader.read(new File(“路径名”))获取根节点document.getRootElement();获取根节点一下的某个节点的迭代Iterator it= document.getRootElement().elementIterator();获取元素迭代器Iterator it=document.selectNodes(“/student/call/name/@show”);(获取根节点一下call节点一下Name节点的属性show的值)修改属性的值attribute.setValue();修改标签的内容element.setText();删除便签父节点.remove(子节点);。

相关文档
最新文档