Dom4j和XPatn

合集下载

Dom4j解析xml内容——(三)

Dom4j解析xml内容——(三)

Dom4j解析xml内容——(三)Dom4j取标签中的内容⽤ getText ,取开始标签和结束标签之间的值。

取属性值有两种⽅式:Jar包:XML原型:<?xml version="1.0" encoding="utf-8"?><书架><书><书名>Java⾼级</书名><作者>武陟县</作者><价格>200元</价格></书><书><书名 name="xxxxxxxxxxx">Java中级</书名><作者>打⽕机</作者><价格>2000元</价格></书></书架>Java类1package Dom4j_XMLParser;23import java.io.File;45import org.dom4j.Attribute;6import org.dom4j.Document;7import org.dom4j.DocumentException;8import org.dom4j.Element;9import org.dom4j.io.SAXReader;10import org.junit.Test;1112public class Demo1 {1314// 获取第⼆本书的书名15 @Test16public void test1() throws Exception {17// 创建SAX读取器18 SAXReader reader = new SAXReader();19// 加载⽂档20 Document document = reader.read(new File("src/book.xml"));21// 获取根节点(书架)22 Element root = document.getRootElement();23// 获取根节点下的书节点,带s返回⼀个数组,再取数组的第⼆个24 Element book = (Element) root.elements("书").get(1);25// 获取树下⾯的书名属性26 Element shuming = book.element("书名");27// 获取书名开始标签与结束标签之间的值28 String value = shuming.getText();29 System.out.println(value);3031 }323334// 获取第⼆本书的书名中的属性 <书名 name="xxxxxxxxxxx">Java中级</书名> 35 @Test36public void test2() throws Exception {37 SAXReader reader = new SAXReader();38 Document document = reader.read(new File("src/book.xml"));39 Element root = document.getRootElement();4041 Element book = (Element) root.elements("书").get(1);42 Element shuming = book.element("书名");4344// 第⼀中⽅法45// 获取name属性46 Attribute attribute = shuming.attribute("name");47// 获取name属性的值48 String attrValue = attribute.getValue();49// 获取书名开始标签与结束标签之间的值50 System.out.println(attrValue); //xxxxxxxxx5152// 第⼆种⽅法(获取书名节点的name属性的值)53 System.out.println(shuming.attributeValue("name")); //xxxxxxxx5455 }56 }。

Dom4j应用中常用方法总结

Dom4j应用中常用方法总结

Dom4j应用中常用方法总结一:构建dom4j树(表示为Document 元素)常用方法:方式一:直接创建所有元素:dom4j为我们准备了工具类DocumentHelper ,该类的所有的方法都是静态方法,用来创建xml文档的各个组成部分。

1.1.1创建Document 和Element对象:Document doc=DocumentHelper.createDocument();Element eltRoot=DocumentHelper.createElement(“student”);doc.setEltRootElement(eltRoot);1.1.2或者先准备好根元素,使用有参数的构造方法创建Document对象。

Element eltRoot=DocumentHelper.createElement(“student”);Document doc=DocumentHelper.createDocument(eltRoot);1.2:添加节点和设置节点内容:方法:Branch 接口中定义的方法;public Element addElemen(String name) //以指定的name 为当前节点创建一个子节点,并返回新节点的引用public void setText(String text) //将content设置为节点的内容示例如下:Element eltName=eltRoot.addElement(“name”);Element eltAge=eltRoot.addElement(“age”);eltName.setText(“张三”);eltAge.setText(“18”);1.3:添加属性方法:public Element addAttribute(String name,String value)示例如下:eltRoot.addAttribute(“sn”,”01”);方式2:2.1:org.dom4j.io提供了两个类:SAXReader和DOMReader,前者从一个现有的w3c DOM 树构建dom4j树,而SAXReader则使用SAX解析器,从不同的输入源构建dom4j树。

Dom4j解析XML文档

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.elementText("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();}}级别:初级Deepak Vohra (dvohra09@), Web 开发人员2004 年4 月01 日dom4j 是一种解析XML 文档的开放源代码XML 框架。

xml解析方式区别

xml解析方式区别
3)SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说, 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXMM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.
JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。
4)DOM4J
JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

java dom4j 解析

java dom4j 解析

java dom4j 解析DOM4J是一个用于处理XML文档的开源Java库,提供了一种基于树形结构的XML文档处理方式。

通过DOM4J库,我们可以方便地读取、修改和生成XML 文档。

在Java中,使用DOM4J解析XML文档通常需要以下步骤:1. 导入DOM4J库:首先需要将DOM4J库导入到项目中,可以通过Maven或手动下载jar包的方式导入。

2. 创建Document对象:在DOM4J中,XML文档的顶层结构是Document对象,我们需要先创建一个Document对象来表示整个XML文档。

3. 读取XML文档:通过DOM4J提供的SAXReader类,我们可以读取XML 文档并将其解析为Document对象。

可以使用SAXReader的read方法来读取XML 文档。

4. 获取根节点:通过Document对象的getRootElement方法可以获取XML文档的根节点,从而可以通过根节点逐级遍历XML文档的结构。

5. 遍历XML文档:可以通过递归遍历XML文档的节点,获取节点的名称、属性、文本内容等信息。

可以使用Element对象的elements方法获取子节点,使用attributeValue方法获取节点属性的值,使用getText方法获取节点的文本内容。

6. 修改XML文档:通过DOM4J可以方便地修改XML文档的内容,包括添加节点、修改节点属性、修改节点文本内容等操作。

可以使用Element对象的addElement方法添加子节点,setAttributeValue方法修改节点属性的值,setText方法修改节点的文本内容。

7. 生成XML文档:通过DOM4J可以将Document对象生成为XML文档,可以通过OutputFormat类设置XML文档的格式,通过XMLWriter类将Document对象输出为XML文档。

总的来说,使用DOM4J解析XML文档可以方便地读取、修改和生成XML文档,提供了一种便捷的XML文档处理方式。

dom4j解析数组类型XML

dom4j解析数组类型XML

dom4j解析数组类型XML系统之间交互经常使用的WebService和JMS技术。

根据甲方项目规划,如果系统之间交互的数据量比较大的话,首先采用JMS方式来发送接收数据,数据内容主要以XML格式为主,各项目组自行约定适合不同业务的XML文档格式。

当系统接收到新的请求,就需要开始解析此消息XML内容。

XML内容一般双方已经约定好了,格式比较固定,可通过Xpath形式直接解析到你想要的数据,但也有例外情况,比如接收到一个客户详细信息的XML,客户详细信息中的联系地址可能有多个,是一个数组此时就无法直接通过Xpath这样的方法来解析了,看以下代码所需jar包:dom4j-1.6.1.jarjaxen-1.1.3.jarxml代码<?xml version="1.0" encoding="UTF-8"?><doc><body><data name="userName"><field length="1" type="string">老罗斯切尔德</field></data><data name="address_array"><!-- 联系地址 --><array><struct><data name="addressType"><field length="20" type="string">home</field></data><data name="content"><field length="20" type="string">英国伦敦</field></data></struct><struct><data name="addressType"><field length="20" type="string">company</field></data><data name="content"><field length="20" type="string">英国</field></data></struct></array></data><data name="contactInfo_array"><array><struct><data name="contactType"><field length="20" type="string">mobile</field></data><data name="content"><field length="20" type="string">158111222</field> </data></struct><struct><data name="contactType"><field length="20" type="string">homePhone</field> </data><data name="content"><field length="20" type="string">010-888888</field> </data></struct></array></data></body></doc>java代码import java.io.File;import java.io.InputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;public class Dom4j {/*** 获取指定xml文档的Document对象,xml文件应在classpath中可以找到* @param xmlFilePath xml文件路径* @return Document对象*/public static Document getDocument(String xmlFilePath) {SAXReader reader = new SAXReader();Document document = null;try {// InputStream in =Dom4j.class.getResourceAsStream(xmlFilePath);// document = reader.read(in);File inputXml=new File(xmlFilePath);document = reader.read(inputXml);System.out.println("获取XML成功");} catch (DocumentException e) {System.out.println(e.getMessage());System.out.println("读取classpath下xmlFileName文件发生异常,请检查CLASSPATH和文件名是否存在!");e.printStackTrace();}return document;}/*** 获取xml中的数组数据* @param xmlFileName* @throws DocumentException*/static void getXmlArray(String xmlFileName) throws DocumentException {Document document = getDocument(xmlFileName);String dataName = null;Element parentElement = null;//以Xpath形式来解析xml 获取整个xml中的数组类型节点List<Element> list =document.selectNodes("/doc/body/data/array");// array后面不要加”/“ for (Iterator iterator = list.iterator(); iterator.hasNext();) {Element elem = (Element) iterator.next();parentElement = elem.getParent();// 取得父节点name值dataName = parentElement.attributeValue("name");// 解析地址信息数组if ("address_array".equals(dataName)) {List addList= getAddress_array(elem);System.out.print("共有"+addList.size()+"个地址信息"); }}}/*** 解析地址信息数组* @param element* @return* @throws DocumentException*/static List<HashMap<String, String>> getAddress_array(Element element) throws DocumentException {System.out.println("......解析地址信息数组开始......");List listStruct = element.elements("struct");//取得array节点下面所有struct节点List<HashMap<String, String>> dataList = newArrayList<HashMap<String, String>>();HashMap<String, String> data_map = null;int i = 1;//循环获取struct节点for (Iterator itera = listStruct.iterator(); itera.hasNext();) {Node node_struct = (Node) itera.next();System.out.println("数组内容" +i+":"+node_struct.asXML());//取得struct节点下面的值,并生成一个document,用此document以Xpath形式获取下面所有的field节点List nodeFields =DocumentHelper.parseText(node_struct.asXML()).selectNodes("/struct/data/field");data_map = new HashMap<String, String>();for (Iterator iteraField = nodeFields.iterator(); iteraField.hasNext();) {Node nodeField = (Node) iteraField.next();String name_con =nodeField.getParent().valueOf("@name");if ("addressType".equals(name_con)) {System.out.println("addressType:" +nodeField.getText());data_map.put("addressType", nodeField.getText()); } else if ("content".equals(name_con)) {System.out.println("content:" +nodeField.getText());data_map.put("content", nodeField.getText());}}dataList.add(data_map);i++;}return dataList;}public static void main(String args[]) throws DocumentException { getXmlArray("E:\\temp_\\xmlInfo.xml");}}。

dom4j用法

dom4j用法

dom4j用法dom4j是一个开源的JavaXML解析库,用于解析XML文档并提供API来操作XML元素和属性。

它可以轻松地读取、分析和生成XML文件。

dom4j支持使用XPath表达式来访问XML文档中的节点和属性。

XPath是一种用于在XML文档中定位节点的语言。

dom4j还提供了一些高级功能,如XML命名空间的支持和DTD验证。

使用dom4j可以轻松地解析XML文档,例如:```SAXReader reader = new SAXReader();Document document = reader.read(newFile('path/to/xml/file.xml'));Element root = document.getRootElement();List<Element> elements = root.elements();for (Element element : elements) {//访问元素}```在上面的代码中,我们使用SAXReader类读取XML文档,并获取根元素。

然后,我们可以使用getRootElement()方法获取XML文档的根元素,并使用elements()方法获取根元素的所有子元素。

除了解析XML文档外,dom4j还提供了API来创建新的XML文档。

例如:```Document document = DocumentHelper.createDocument();Element root = document.addElement('root');Element child = root.addElement('child');child.addAttribute('attribute', 'value');child.setText('text');```在上面的代码中,我们使用DocumentHelper类创建一个新的XML 文档,并添加根元素和一个子元素。

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较

XML的四种解析器原理及性能比较1.DOM解析器:DOM解析器将整个XML文档加载到内存中,形成一个树形结构(DOM 树),并提供了对该树进行遍历、查询和修改的操作。

DOM解析器适合于需要多次访问XML元素且需要对XML进行频繁修改的场景。

DOM解析器的原理是将整个XML文档转换为一个树形结构,其中每个节点代表一个XML元素。

由于需要将整个文档加载到内存中,所以对于大型的XML文档,DOM解析器的内存消耗会比较大。

2.SAX解析器:SAX解析器的原理是逐个读取XML文档的节点,并在遇到事件时通过回调函数进行处理。

由于SAX解析器在解析过程中不需要将整个文档加载到内存,所以对于大型的XML文档,它的内存消耗相对较小。

3.StAX解析器:StAX解析器是一种基于迭代器的流式解析器。

它提供了许多类似于迭代器的方法,可以用于逐个处理XML文档中的节点。

StAX解析器既支持事件驱动的处理方式,也支持基于指针的处理方式。

StAX解析器的原理是通过指针方式遍历XML文档,并提供了一系列的API来操作当前指针所指向的节点。

由于StAX解析器在解析过程中只需要加载部分文档内容到内存,所以其内存消耗也比较小。

4. XPath解析器:XPath解析器是一种通过路径表达式来定位和选择XML文档中的节点的解析器。

XPath解析器可以将一个XPath表达式应用到XML文档上,然后返回所匹配的节点集合或属性的值。

XPath解析器的原理是将XPath表达式与XML文档进行匹配,使用查询语言来过滤和选择XML文档中的节点集合。

由于XPath解析器只需加载部分文档内容,所以其内存消耗也较小。

性能比较方面,选择解析器应根据实际需求和XML文档的特点来决定:- 对于小型XML文档,在DOM解析器中使用XPath表达式进行查询较为方便,且性能较好;-对于大型XML文档,SAX解析器和StAX解析器是更好的选择,因为它们在解析过程中不需要加载整个文档到内存中,所以能够节省内存消耗;-如果需要对XML文档进行多次访问和修改,DOM解析器是较好的选择,因为它可以将文档加载到内存中形成DOM树,可以方便地进行多次操作。

Dom4j使用方法

Dom4j使用方法

Dom4j 解析XML 使用方法
1、下载Dom4j
下载这个文件到官网找几乎不可能找到,不信可以试试。

大家可以到如下地址下载:/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/
进入网址后可以看到网页有以上三个jar文件可以下载,当然你可以一个个下载,也可以点击这个链接(安装Ctrl键)Download dom4j-1.6.1.zip (11.7 MB) 进行下载。

2、配置
下载后我们可以得到dom4j-1.6.1.zip 的压缩文件。

在这一堆文件中把dom4j-1.6.1.jar解压下来。

接着把它加载到项目。

下面以eclipse为例
选择你要加载的项目,右击Build Path --- Configure~~~ 如图
在弹出的对话框中,点击Add External JARs~~~
按路径找到你刚才解压的文件点击打开,最后退出点击OK就行了。

3、使用
创建一个xml文件
新建class文件,文件名为:Dom4j.java 这个文件可以让我们创建一个基本的xml。

Dom4jTest.jav a
(红色方块点击可以获得源码)
读取xml文件
Dom4jTest2.jav a
更多内容可以发生邮件baaio@。

dom4j基本操作

dom4j基本操作

dom4j基本操作DOM4J与利⽤DOM、SAX、JAXP机制来解析xml相⽐,DOM4J 表现更优秀,具有性能优异、功能强⼤和极端易⽤使⽤的特点,只要懂得DOM基本概念,就可以通过dom4j的api⽂档来解析xml。

dom4j是⼀套开源的api。

实际项⽬中,往往选择dom4j来作为解析xml的利器。

针对于XML标准定义,对应于图2-1列出的内容,dom4j提供了以下实现:常⽤APIorg.dom4j.io.SAXReaderread 提供多种读取xml⽂件的⽅式,返回⼀个Domcument对象org.dom4j.Documentiterator 使⽤此法获取nodegetRootElement 获取根节点org.dom4j.NodegetName 获取node名字,例如获取根节点名称为bookstoregetNodeType 获取node类型常量值,例如获取到bookstore类型为1——ElementgetNodeTypeName 获取node类型名称,例如获取到的bookstore类型名称为Elementorg.dom4j.Elementattributes 返回该元素的属性列表attributeValue 根据传⼊的属性名获取属性值elementIterator 返回包含⼦元素的迭代器elements 返回包含⼦元素的列表org.dom4j.AttributegetName 获取属性名getValue 获取属性值org.dom4j.TextgetText 获取Text节点值org.dom4j.CDATAgetText 获取CDATA Section值mentgetText 获取注释下⾯做了⼀个类以如下的XML为例:<html><head><title>解析xml例⼦</title><script><username>yangrong</username><password>123456</password></script></head><body><result>0</result><form><banlce>1000</banlce><subID>36242519880716</subID></form></body></html>import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.List;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .URL;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;import com.alibaba.fastjson.JSON;public class OperateXml {@SuppressWarnings("unused")public static void main(String[] args) {// 下⾯是需要解析的xml字符串例⼦String xmlString = "<html><head><title>解析xml例⼦</title><script><username>yangrong</username><password>123456</password></script></head><body><result>0</result><form><banlce>1000</banlce><subID>36242519880716</ //主动创建document对象.Document document=DocumentHelper.createDocument();//建⽴document对象,⽤来操作xml⽂件Document testdoc=DocumentHelperreadStringXml(xmlString);//将⽂档或节点的XML转化为字符串.String docXmlText=testdoc.asXML();String teststring=Documentanalysis1(testdoc);System.out.print(teststring);}public static Document DocumentHelperreadStringXml(String xmlContent) {// DocumentHelper 解析xml字符串Document document = null;try {document = DocumentHelper.parseText(xmlContent);} catch (DocumentException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}return document;}public static Document SAXReaderreadStringXml(String xmlContent)throws DocumentException, UnsupportedEncodingException {/* SAXReader解析xml字符串 */Document document = null;try {// 读取输⼊流SAXReader saxReader = new SAXReader();document = saxReader.read(new ByteArrayInputStream(xmlContent.getBytes("utf-8")));// 字符串要根据相应的编码转成输⼊流才能被SAXReader读取。

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. 我们 的应 用 程序 可 以通 过

scala中引用dom4j解析xml

scala中引用dom4j解析xml

scala中引用dom4j解析xml使用Scala中的dom4j库解析XML文件一、引言在软件开发过程中,经常需要处理和解析XML数据。

XML是一种标记语言,用于存储和传输数据。

为了方便处理XML数据,许多编程语言提供了相应的库和工具。

本文将介绍如何使用Scala中的dom4j库来解析XML文件。

二、dom4j简介dom4j是一个用于处理XML数据的Java库。

它提供了简单易用的API,使开发人员能够轻松地读取、修改和创建XML文档。

dom4j库具有高性能和低内存消耗的特点,因此被广泛应用于各种项目中。

三、使用dom4j解析XML1. 导入dom4j库首先,我们需要在Scala项目中导入dom4j库。

可以使用SBT或Maven等构建工具来管理项目依赖。

2. 创建XML解析器在Scala中使用dom4j解析XML文件,首先需要创建一个XML解析器对象。

可以通过如下代码来创建一个解析器对象:```scalaval xmlParser = new SAXReader()```3. 加载XML文件使用解析器对象加载XML文件。

可以通过文件路径或输入流来加载XML文件。

例如,使用文件路径加载XML文件的代码如下:```scalaval document = xmlParser.read(new File("path/to/xml/file.xml"))```4. 解析XML数据通过解析器对象,可以获取XML文档的根元素,并遍历其子元素和属性。

以下示例代码演示了如何解析XML数据:```scalaval rootElement = document.getRootElement()// 遍历子元素val elements = rootElement.elements()for (i <- 0 until elements.size()) {val element = elements.get(i).asInstanceOf[Element]// 处理子元素println("子元素名称:" + element.getName())}// 获取属性val attributes = rootElement.attributes()for (i <- 0 until attributes.size()) {val attribute = attributes.get(i).asInstanceOf[Attribute]// 处理属性println("属性名:" + attribute.getName() + ",属性值:" + attribute.getValue())}```5. 解析XML文档结构dom4j库提供了丰富的API来解析XML文档的结构。

dom4j解析xml

dom4j解析xml

dom4j解析xml现在有很多⼯具包可以解析xml⽂件,但是dom4j⽆疑是其中较为简单的⼀种,下⾯就⽤⼀个例⼦来实际操作⼀下:⾸先得导⼊dom4j.jar这个夹包(⽹上⼀搜⼀⼤⽚)1.随便在⼀个地⽅建⽴⼀个user.xml⽂件,我这⼉是建⽴在d盘根⽬录下:1. <?xml version="1.0" encoding="UTF-8"?>2.3. <users>4. <user username="lisi" password="123"/>5. <user username="张三" password="123"/>6. <user username="zhangsan" password="123"/>7.8. </users><?xml version="1.0" encoding="UTF-8"?><users><user username="lisi" password="123"/><user username="张三" password="123"/><user username="zhangsan" password="123"/></users>2.对该⽂件进⾏模拟查询⽤户(按姓名查询)和添加⽤户:1. package com.easyteam.dao;2.3. import java.io.FileNotFoundException;4. import java.io.FileOutputStream;5. import java.io.IOException;6. import java.io.OutputStream;7. import java.io.OutputStreamWriter;8. import java.io.UnsupportedEncodingException;9.10. import org.dom4j.Document;11. import org.dom4j.DocumentException;12. import org.dom4j.Element;13. import org.dom4j.io.OutputFormat;14. import org.dom4j.io.SAXReader;15. import org.dom4j.io.XMLWriter;16.17. import er;18.19.20. public class Userdao {21.22. String path="d://user.xml";23.24. public User findByName(String username){25. SAXReader red=new SAXReader();//创建解析器26. try {27. Document doc=red.read(path);//得到documet对象28. Element el=(Element) doc.selectSingleNode("//user[@username='"+username+"']");//查询条件,其中//表⽰⽆限深度查询,[]中放⼊是查询条件29. if(el==null) return null;30. String attUsername=el.attributeValue("username");//得到username这个属性的值31. String attPassword=el.attributeValue("password");32. User user=new User();33. user.setUsername(attUsername);34. user.setPassword(attPassword);35. return user;36. } catch (DocumentException e) {37. throw new RuntimeException(e);38. }39. }40. public void addUser(User user){41.42. SAXReader red=new SAXReader();43. try {44. Document doc = red.read(path);45. Element attroot=doc.getRootElement();//得到根节点46. Element userel=attroot.addElement("user");//添加节点47. userel.addAttribute("username", user.getUsername());//给新节点赋值48. userel.addAttribute("password", user.getPassword());49.50. OutputFormat format=new OutputFormat("\t", true);//设置格式51. format.setTrimText(true);//清除原有格式52. XMLWriter writer;53. try {54. writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream(path),"utf-8"),format);//实例化55. writer.write(doc);//保存56. writer.close();57. } catch (Exception e) {58. throw new RuntimeException(e);59. }60.61. } catch (DocumentException e) {62. throw new RuntimeException(e);63. }64. }65. }3.测试类:1. package com.easyteam.test;2.3. import org.junit.Test;4.5. import erdao;6. import er;7.8.9. public class UserDaoTest {10. @Test11.12. public void testfindByName(){13. Userdao dao=new Userdao();14. User user= dao.findByName("lisi");15. System.out.println(user);16.17. }18. @Test19. public void testaddUser(){20. Userdao dao=new Userdao();21. User user=new User();22. user.setUsername("张三");23. user.setPassword("123");24. dao.addUser(user);25.26.27.28. }29. }。

DOM4J解析XML

DOM4J解析XML

本文主要讨论了用dom4j解析XML的基础问题,包括建立XML文档,添加、修改、删除节点,以及格式化(美化)输出和中文问题。

可作为dom4j的入门资料。

1.下载与安装dom4j是上的一个开源项目,主要用于对XML的解析。

从2001年7月发布第一版以来,已陆续推出多个版本,目前最高版本为dom4j-1.6.1。

dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j正迅速普及。

可以到/projects/dom4j下载其最新版。

dom4j1.6解压后有一个dom4j-1.6.1.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-6.jarr文件,一般也需要引入,否则执行时可能抛ng. NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。

2.示例XML文档(holen.xml)为了述说方便,先看一个XML文档,之后的操作均以此文档为基础。

holen.xml<?xml version="1.0" encoding="UTF-8"?><books><!--This is a test for dom4j, holen, 2004.9.11--><book show="yes"><title>Dom4j Tutorials</title></book><book show="yes"><title>Lucene Studing</title></book><book show="no"><title>Lucene in Action</title></book><owner>O'Reilly</owner></books>这是一个很简单的XML文档,场景是一个网上书店,有很多书,每本书有两个属性,一个是书名[title],一个为是否展示[show],最后还有一项是这些书的拥有者[o wner]信息。

【黑马程序员】Dom4J解析XML的范例浅析

【黑马程序员】Dom4J解析XML的范例浅析

【黑马程序员】Dom4J解析XML的范例浅析前言XML是可扩展标记语言的缩写,在编程领域是非常常用的,我们经常会用它进行数据的传输或者用作配置文件,那么对XML的操作的也会是我们需要掌握的一项技术,本文会使用Java语言,利用DOM4J这个非常优秀的开源库,探讨生成XML格式数据和解析XML数据的两个方面的问题。

1. Dom4J简介在上,是这么介绍的:Dom4j是一个易用的、开源的库,用于XML,XPath 和XSLT。

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

简单来说,Dom4j具有性能优秀,操作简单的优点2. Dom4j的使用2.1 导入jar包这个操作非常简单,我们可以在网上下载jar包,或者在https:///projects/dom4j/?source=directory下载了dom4j项目之后,解压缩成jar包,然后导入项目中2.2 案例一:用Java代码生成xml文档代码思路:我们要生成一个XML文档,其实就像我们平时书写文档是一样的道理:创建文档-> 创建根元素-> 添加根元素子元素也是先创建再添加到其他元素中如果元素上有属性则先添加属性下面直接上代码import java.io.FileOutputStream;import java.io.FileWriter;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;public class Dom4JTest1 {public static void main(String[] args) throws Exception {// 第一种方式:创建文档,并创建根元素// 创建文档:使用了一个Helper类Document document = DocumentHelper.createDocument();// 创建根节点并添加进文档Element root = DocumentHelper.createElement("student");document.setRootElement(root);// 第二种方式:创建文档并设置文档的根元素节点Element root2 =DocumentHelper.createElement("student");Document document2 =DocumentHelper.createDocument(root2);// 添加属性root2.addAttribute("name", "zhangsan");// 添加子节点:add之后就返回这个元素Element helloElement = root2.addElement("hello");Element worldElement = root2.addElement("world");helloElement.setText("hello Text");worldElement.setText("world text");// 输出// 输出到控制台XMLWriter xmlWriter = new XMLWriter();xmlWriter.write(document);// 输出到文件// 格式OutputFormat format = new OutputFormat(" ", true);// 设置缩进为4个空格,并且另起一行为trueXMLWriter xmlWriter2 = new XMLWriter(new FileOutputStream("student.xml"), format);xmlWriter2.write(document2);// 另一种输出方式,记得要调用flush()方法,否则输出的文件中显示空白XMLWriter xmlWriter3 = new XMLWriter(newFileWriter("student2.xml"),format);xmlWriter3.write(document2);xmlWriter3.flush();// close()方法也可以}}程序Console输出:<?xml version="1.0" encoding="UTF-8"?><student/>生成的一个xml文档:<?xml version="1.0" encoding="UTF-8"?><student name="zhangsan"><hello>hello Text</hello><world>world text</world></student>小总结到目前为止我们已经完成了对一个xml格式数据的生成,如果要生成其他样式的数据,也是比较类似的操作,本文就不再赘述了。

dom4j分段读取

dom4j分段读取

dom4j分段读取
dom4j分段读取是一种在处理大型XML文件时常用的技术,它可以将整个XML文件分成多个小段,然后逐个读取每个小段。

这样做的好处是可以将大的XML文件分解成更小的部分,从而减少一次性读取整个文件所需的内存量,避免内存溢出的问题。

dom4j分段读取通常使用XPath表达式来定位每个小段的起始和结束位置。

在读取每个小段时,可以使用dom4j的SAX解析器来解析该段XML数据,并将其转换为Java对象或数据结构,以便后续处理。

实现dom4j分段读取需要编写一个能够读取XML文件的Java程序,并在程序中使用XPath表达式定位每个小段的起始和结束位置。

然后,使用dom4j的SAX解析器逐个读取每个小段,并将其转换为Java对象或数据结构,以便后续处理。

在实现dom4j分段读取时,需要注意以下几点:
1. 确保XPath表达式正确地定位每个小段的起始和结束位置。

2. 确保在读取每个小段时正确地解析XML数据并将其转换为Java对象或数据结构。

3. 对于大型XML文件,可能需要将文件分块处理,以避免内存溢出的问题。

4. 在处理每个小段时,可能需要处理一些共同的逻辑,例如对每个小段的数据进行验证或过滤。

总之,dom4j分段读取是一种非常实用的技术,可以有效地处理大型XML文件,特别是在内存有限的情况下。

1。

dom4j xpath教程

dom4j xpath教程

学习:Dom4j和Xpath1、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 Document load(String filename) {Document document = null;try {SAXReader saxReader = new SAXReader();document = saxReader.read(new File(filename)); //读取XML文件,获得document对象} catch (Exception ex) {ex.printStackTrace();}return document;}或public static Document load(URL url) {Document document = null;try {SAXReader saxReader = new SAXReader();document = saxReader.read(url); //读取XML文件,获得document对象} catch (Exception ex) {ex.printStackTrace();}return document;}//读取指定的xml文件之后返回一个Document对象,这个对象代表了整个XML文档,用于各种Dom运算。

dom4j解析复杂的xml文件

dom4j解析复杂的xml文件

dom4j解析复杂的xml⽂件待解析的xml⽂件:<?xml version="1.0" encoding="utf-8"?><ResInfo><barcode/><asset><assetcardno>B</assetcardno><comments/><buydate/><category/></asset><entity><entityid>901061314</entityid><entitycode>LTJHXYYCX01/XA-HWMACBTS529</entitycode><entityname>蓝⽥局华胥电信营业厅CDMA基站/BTS529</entityname><entityspec>BTS</entityspec><vendorname>HuaWei</vendorname><model>HUAWEI BTS3900</model><installaddress/></entity><version/><sectornum>3</sectornum><rackname>HW401C</rackname><containers><container><shelfhight>0.086</shelfhight><cardinfos><cardinfo><cardname>290.蓝⽥局华胥电信营业厅CDMA基站/BTS529/架1列1/框3槽(0)HECM</cardname></cardinfo><cardinfo><cardname>290.蓝⽥局华胥电信营业厅CDMA基站/BTS529/架1列1/框3槽(10)FAN</cardname></cardinfo><cardinfo><cardname>290.蓝⽥局华胥电信营业厅CDMA基站/BTS529/架1列1/框3槽(9)UPEU</cardname></cardinfo><cardinfo><cardname>290.蓝⽥局华胥电信营业厅CDMA基站/BTS529/架1列1/框3槽(7)CMPT</cardname></cardinfo><cardinfo><cardname>290.蓝⽥局华胥电信营业厅CDMA基站/BTS529/架1列1/框3槽(2)HCPM</cardname></cardinfo></cardinfos></container><container><shelfhight>0.308</shelfhight><cardinfos><cardinfo><cardname>290.蓝⽥局华胥电信营业厅CDMA基站/BTS529/架1列1/框1槽(2)CRFU</cardname></cardinfo><cardinfo><cardname>290.蓝⽥局华胥电信营业厅CDMA基站/BTS529/架1列1/框1槽(4)CRFU</cardname></cardinfo><cardinfo><cardname>290.蓝⽥局华胥电信营业厅CDMA基站/BTS529/架1列1/框1槽(0)CRFU</cardname></cardinfo></cardinfos></container><container><shelfhight>0.086</shelfhight></container><container><shelfhight>0.044</shelfhight></container></containers><ReturnResult>0</ReturnResult><ReturnInfo>成功</ReturnInfo></ResInfo>j⽤dom4j解析该xml⽂件需要导⼊的jar包:import org.apache.log4j.Logger;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;//dom4j解析xml//创建SAXReader对象 readerSAXReader reader = new SAXReader();//因为我项⽬中的xml⽂件是查出来的,类型是字符串类型,所以我们需要把字符串转换成xml⽂件String resultxml = broadBandResult.getReviceXML();//我拿到的字符串类型的返回报⽂Document document = DocumentHelper.parseText(resultxml); //将字符串转换成xml,具体转换可以百度搜索 dom4j字符串转xml//获取⽂件的根节点Element root = document.getRootElement();String node1Name = "需展⽰的节点名称";//得到节点的值 /ResInfo/asset/assetcardno为需要得到哪个节点的路径//这⾥我要得到assetcardno节点的值String node1text = root.selectSingleNode("/ResInfo/asset/assetcardno").getText();String node2Name = "描述";String node2text = root.selectSingleNode("/ResInfo/asset/comments").getText();//因为项⽬需要拼接html ,这⼀部分⼤家可以略过不看desc.append("<div class=\"mui-input-row\" style=\"-webkit-user-select:text;height:30%\"><label>"+node1Name+"</label><label name='"+node1text+"' id='"+node1text+"1' style=\"width: 60%;\">"+node1text+"</label></div>" .append("<div class=\"mui-input-row\" style=\"-webkit-user-select:text;height:30%\"><label>"+node2Name+"</label><label name='"+node2text+"' id='"+node2text+"1' style=\"width: 60%;\">"+node2text+"</label></div>")//得到containers节点Node node1 = root.selectSingleNode("/ResInfo/containers");//得到containers节点下边的⼦节点container,因为有多个container,所以⽤list集合接收List<Element> list = ((Element) node1).elements("container");//循环这个集合for (Element element : list) {String node13Name = "机框安装⾼度";//得到container节点⾥⾯的shelfhight节点Element node13 =element.element("shelfhight");//得到shelfhight节点的值String node13Text = node13.getText();//拼接htmldesc.append("<li class=\"mui-table-view-cell\" ><div style=\"width: 80%;float: left;\"></div><br/>").append("<div><label>"+node13Name+"</label><label name='"+node13Text+"' id='"+node13Text+"1' style=\"width: 60%;\">"+node13Text+"</label></div><br/>"); //得到container节点⾥⾯的cardinfosElement node14 =(Element) element.selectSingleNode("cardinfos");if(node14 != null){logger.error("===node14==="+node14);//得到cardinfos节点⾥⾯的cardinfo节点,因为cardinfos节点⾥⾯有多个cardinfo节点,所以⽤List集合接收List<Element> childList2 =node14.elements("cardinfo");logger.error("===childList2集合长度==="+childList2.size());//循环childList2 集合for (Element element2 : childList2) {String node15Name = "机框下的板卡拼装名称列表";//得到cardinfo节点⾥⾯的cardname节点Element node15 =element2.element("cardname");//得到cardname节点的值String node15Text = node15.getText();// 拼接htmldesc.append("<div><label name='"+node15Text+"' id='"+node15Text+"1' style=\"width:60%;\">"+node15Text+"</label></div><br/>");}}desc.append("</li>");}这样就解析完了⼀个xml⽂件。

dom4j解析

dom4j解析

dom4j解析XML (c Nested exception: c错误解决)Java 2009-12-18 19:41:58 阅读64 评论0 字号:大中小订阅dom4j 是一种解析XML 文档的开放源代码XML 框架,与W3C DOM API 相比,使用dom4j 所包含的解析器的好处是dom4j 拥有本地的XPath 支持.DOM 解析器不支持使用XPath 选择节点.该解析器可以从/ 获取.java 代码1. package com.nikee.dom4j;2. import org.dom4j.Document;3. import org.dom4j.DocumentHelper;4. import org.dom4j.Element;5. import org.dom4j.io.OutputFormat;6. import org.dom4j.io.XMLWriter;7. import java.io.*;8.9. public class XmlDom4J{10. public void generateDocument(){11. //使用 DocumentHelper 类创建一个文档实例。

DocumentHelper 是生成 XML 文档节点的 dom4j API 工厂类12. Document document = DocumentHelper.createDocument();13.14. //使用 addElement()方法创建根元素catalog , addElement()用于向 XML 文档中增加元素15. Element catalogElement = document.addElement("catalog");16.17. //在 catalog 元素中使用 addComment() 方法添加注释"An XML catalog"18. catalogElement.addComment("An XML Catalog");19.20. //在 catalog 元素中使用 addProcessingInstruction() 方法增加一个处理指令21. catalogElement.addProcessingInstruction("target","text");22.23. //在 catalog 元素中使用 addElement() 方法增加 journal 元素24. Element journalElement = catalogElement.addElement("journal");25. //使用 addAttribute() 方法向 journal 元素添加 title 和 publisher 属性26. journalElement.addAttribute("title", "XML Zone");27. journalElement.addAttribute("publisher", "IBM developerWorks");28.29.30. Element articleElement=journalElement.addElement("article");31. articleElement.addAttribute("level", "Intermediate");32. articleElement.addAttribute("date", "December-2001");33.34. Element titleElement=articleElement.addElement("title");35. titleElement.setText("Java configuration with XML Schema");36.37. Element authorElement=articleElement.addElement("author");38. Element firstNameElement=authorElement.addElement("firstname");39. firstNameElement.setText("Marcello");40. Element lastNameElement=authorElement.addElement("lastname");41. lastNameElement.setText("Vitaletti");42.43. //可以使用 addDocType() 方法添加文档类型说明44. //这样就向 XML 文档中增加文档类型说明:45. document.addDocType("catalog","nikee","file://c:/Dtds/catalog.dtd");46. try{47. //XMLWriter output = new XMLWriter(new FileWriter( new File("D:/eclipse3.2/workspace/WebServices/src/com/nikee/dom4j/catalog.xml")));48. FileOutputStream fos=new FileOutputStream("D:/eclipse3.2/workspace/WebServices/src/com/nikee/dom4j/catalog.xml");49. OutputFormat of=new OutputFormat(" ", true);50. XMLWriter xw=new XMLWriter(fos, of);51. xw.write( document );52. xw.close();53. }54. catch(IOException e)55. {56. System.out.println(e.getMessage());57. }58. }59.60. public static void main(String[] argv){61. XmlDom4J dom4j=new XmlDom4J();62. dom4j.generateDocument();63. }64. }xml 代码1. <!--sp-->xml version="1.0" encoding="UTF-8"?>2. <!--CTYPE catalog PUBLIC "nikee" "file://c:/Dtds/catalog.dtd"</sp-->>3.4. <catalog>5. <!--An XML Catalog--><!--sp-->target text?>6.7. <journal title="XML Zone" publisher="IBM developerWorks">8. <article level="Intermediate" date="December-2001">9. <title>Java configuration with XML Schematitle>10. <author>11. <firstname>Marcellofirstname>12. <lastname>Vitalettilastname>13. author>14. article>15. journal>16. catalog>XmlDom4J.java 用于创建XML 文档catalog.xmljava 代码1. package com.nikee.dom4j;2.3. import org.dom4j.Document;4. import org.dom4j.Element;5. import org.dom4j.Attribute;6. import java.util.List;7. import java.util.Iterator;8.9. import org.dom4j.io.OutputFormat;10. import org.dom4j.io.XMLWriter;11. import java.io.*;12.13. import org.dom4j.DocumentException;14. import org.dom4j.io.SAXReader;15.16. public class Dom4Jparser{17. public Dom4Jparser(){18. //construction19. }20.21. public void modifyDocument(File inputXml){22. try{23. //使用 SAXReader 解析 XML 文档 catalog.xml24. SAXReader saxReader = new SAXReader();25. Document document = saxReader.read(inputXml);26.27. //使用 XPath 表达式从 article 元素中获得 level 节点列表。

详解 Dom4j进行读取JAVA XML文件

详解 Dom4j进行读取JAVA XML文件

详解 Dom4j进行读取JAVA XML文件详解dom4j进行读取javaxml文件dom4j进行读取javaxml文件首先引入dom4jjar圣塞雷县建立xml文件,例如图:创建好xml文件后,我们根据其逻辑关系,建立如下类:country(实体国家类:建立province(省份)实体类创建city(城市)实体类不好,我们须要的guo.xml,和三个对应的实体类以建,下面我们建立个法,具体内容和注解如下:packagetest;importjava.io.inputstream;importjava.util.arraylist;importjava.util.list;importorg.dom4j.document;importorg.dom4j.documentexception;importorg.dom4j.element;importorg.dom4j.io.s axreader;importentity.country;importentity.province;publicclasstestmain{main()方/***@paramargs*/publicstaticvoidmain(string[]args){//todoauto-generatedmethodstub//创建saxreader的对象saxreadersr=newsaxreader();//根据文件流加载xml文件inputstreamis=testmain.class.getresourceasstream(\);try{//利用saxreader的对象的read方法展开加载documentdt=sr.read(is);//document对象的getrootelement()获得xml文件中的第一层节点,即binggoelementbinggo=dt.getrootelement();//我们对其进行输出如下输出:binggosystem.out.println(\第一层节点名称:\+binggo.getname());/***如下是获得单个节点下的所有内容,*获取其它单个节点同理*///以获取其它名称相似,下一步我们将要赢得country节点中属性名称的值。

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

学习:Dom4j和Xpath1、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 Document load(String filename) {Document document = null;try {SAXReader saxReader = new SAXReader();document = saxReader.read(new File(filename)); //读取XML文件,获得document 对象} catch (Exception ex) {ex.printStackTrace();}return document;}或public static Document load(URL url) {Document document = null;try {SAXReader saxReader = new SAXReader();document = saxReader.read(url); //读取XML文件,获得document对象} catch (Exception ex) {ex.printStackTrace();}return document;}//读取指定的xml文件之后返回一个Document对象,这个对象代表了整个XML文档,用于各种Dom运算。

执照XML文件头所定义的编码来转换。

2.2、获取根节点根节点是xml分析的开始,任何xml分析工作都需要从根开始Xml xml = new Xml();Document dom = xml.load(path + "/" + file);Element root = dom.getRootElement();2.3、. 新增一个节点以及其下的子节点与数据Element menuElement = root.addElement("menu");Element engNameElement = menuElement.addElement("engName"); engNameElement.setText(catNameEn);Element chiNameElement = menuElement.addElement("chiName"); chiNameElement.setText(catName);2.4、写入XML文件注意文件操作的包装类是乱码的根源public static boolean doc2XmlFile(Document document, String filename) {boolean flag = true;try {XMLWriter writer = new XMLWriter( new OutputStreamWriter(new FileOutp utStream(filename),"UTF-8"));writer.write(document);writer.close();} catch (Exception ex) {flag = false;ex.printStackTrace();}System.out.println(flag);return flag;}Dom4j通过XMLWriter将Document对象表示的XML树写入指定的文件,并使用OutputFormat格式对象指定写入的风格和编码方法。

调用OutputFormat. createPrettyPrint()方法可以获得一个默认的pretty print风格的格式对象。

对OutputFormat对象调用setEncoding()方法可以指定XML文件的编码方法。

public void writeTo(OutputStream out, String encoding) throws Unsuppo rtedEncodingException, IOException {OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("gb2312");XMLWriter writer = new XMLWriter(System.out,format);writer.write(doc);writer.flush();return;}2. 5、遍历xml节点对Document对象调用getRootElement()方法可以返回代表根节点的Element对象。

拥有了一个Element对象后,可以对该对象调用elementIterator()方法获得它的子节点的E lement对象们的一个迭代器。

使用(Element)iterator.next()方法遍历一个iterator并把每个取出的元素转化为Element类型。

public boolean isOnly(String catNameEn,HttpServletRequest request,Str ing xml) {boolean flag = true;String path = request.getRealPath("");Document doc = load(path+"/"+xml);Element root = doc.getRootElement();for (Iterator i = root.elementIterator(); i.hasNext();) {Element el = (Element) i.next();if(catNameEn.equals(el.elementTextTrim("engName"))){flag = false;break;}}return flag;}2.6、创建xml文件public static void main(String args[]){String fileName="c:/text.xml";Document document=DocumentHelper.createDocument();//建立document对象,用来操作xml文件Element booksElement=document.addElement("books");//建立根节点booksElement.addComment("This is a test for dom4j ");//加入一行注释Element bookElement=booksElement.addElement("book");//添加一个book节点bookElement.addAttribute("show","yes");//添加属性内容Element titleElement=bookElement.addElement("title");//添加文本节点titleElement.setText("ajax in action");//添加文本内容try{XMLWriter writer=new XMLWriter(new FileWriter(new File(fileName)));writer.write(document);writer.close();}catch(Exception e){e.printStackTrace();}}2.7、修改节点属性public static void modifyXMLFile() {String oldStr = "c:/text.xml";String newStr = "c:/text1.xml";Document document = null;//修改节点的属性try{SAXReader saxReader = new SAXReader(); // 用来读取xml文档document = saxReader.read(new File(oldStr)); // 读取xml文档List list = document.selectNodes("/books/book/@show");// 用xpath查找节点boo k的属性Iterator iter = list.iterator();while(iter.hasNext()) {Attribute attribute = (Attribute) iter.next();if(attribute.getValue().equals("yes"))attribute.setValue("no");}} catch(Exception e) {e.printStackTrace();}//修改节点的内容try{SAXReader saxReader = new SAXReader(); // 用来读取xml文档document = saxReader.read(new File(oldStr)); // 读取xml文档List list = document.selectNodes("/books/book/title");// 用xpath查找节点book的内容Iterator iter = list.iterator();while(iter.hasNext()) {Element element = (Element) iter.next();element.setText("xxx");// 设置相应的内容}} catch(Exception e) {e.printStackTrace();}try{XMLWriter writer = new XMLWriter(new FileWriter(new File(newStr))); writer.write(document);writer.close();} catch(Exception ex) {ex.printStackTrace();}}2.8、删除节点public static void removeNode() {String oldStr = "c:/text.xml";String newStr = "c:/text1.xml";Document document = null;try{SAXReader saxReader = new SAXReader();// 用来读取xml文档document = saxReader.read(new File(oldStr));// 读取xml文档List list = document.selectNodes("/books/book");// 用xpath查找对象Iterator iter = list.iterator();while(iter.hasNext()) {Element bookElement = (Element) iter.next();// 创建迭代器,用来查找要删除的节点,迭代器相当于指针,指向book下所有的title节点Iterator iterator = bookElement.elementIterator("title");while(iterator.hasNext()) {Element titleElement = (Element) iterator.next();if(titleElement.getText().equals("ajax in action")) {bookElement.remove(titleElement);}}}} catch(Exception e) {e.printStackTrace();}try{XMLWriter writer = new XMLWriter(new FileWriter(new File(newStr))); writer.write(document);writer.close();} catch(Exception ex) {ex.printStackTrace();}}2、XML文档操作22.1、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.parseTex t(text);3、主动创建document对象.Document document = DocumentHelper.createDoc ument();Element root = document.addElement("members ");// 创建根节点2.2、节点相关1、获取文档的根节点.Element rootElm = document.getRootElement();2、取得某节点的单个子节点.Element memberElm=root.element("member");// "member"是节点名3.取得节点的文字String text=memberElm.getText();String text=root.elementText("name");这个是取得根节点下的name字节点的文字.4.取得某节点下指定名称的所有节点并进行遍历.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.hasN ext();){Element element = (Element) it.next ();// do something}6.在某节点下添加子节点.Element ageElm = newMemberElm.addElement("age");7.设置节点文字.ageElm.setText("29");8.删除某节点.parentElm.remove(childElm); // childElm是待删除的节点,parentEl m是其父节点9.添加一个CDATA节点.Element contentElm = infoElm.addElement("content ");contentElm.addCDATA(diary.getContent());2.3、属性相关.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);2.4、将文档写入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"),forma t);writer.write(document);writer.close();2.5、字符串与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();3、dom4j的事件处理模型涉及的类和接口:3.1、类:SAXReaderpublic void addHandler(String path,ElementHandler handler)当解析到path指定的路径时,将调用参数handler指定的处理器。

相关文档
最新文档