java,解析想xml,生成xml,步骤,原理
- 格式:doc
- 大小:22.50 KB
- 文档页数:2
java解析xml的原理XML (eXtensible Markup Language) 是一种用于描述数据的标记语言,被广泛应用于数据交换和文档存储。
在Java开发中,解析XML是一项常见的任务,Java提供了多种方式来解析XML,包括DOM (Document Object Model),SAX (Simple API for XML),和StAX (Streaming API for XML)。
1. DOM解析XMLDOM解析器将整个XML文档加载到内存中,并将其表示为一个树状结构,可以通过操作树节点来访问和修改XML数据。
DOM解析XML的原理如下:a) 读取整个XML文件到内存中,构建一个DOM树。
b) 遍历DOM树,根据节点的类型 (元素、属性、文本等) 来访问和操作XML数据。
DOM解析XML的优点是可以随机访问XML节点,灵活性高,可以方便地对XML数据进行增、删、改操作。
然而,由于将整个XML文档加载到内存中,占用较大内存空间,适合处理小型XML文件。
2. SAX解析XMLSAX解析器按顺序逐行读取XML文档,当遇到节点开始、节点结束、文本等事件时,调用相应的回调方法处理节点数据。
SAX解析XML的原理如下:a) 逐行读取XML文档。
b) 遇到节点开始、节点结束、文本等事件时,调用相应的回调方法处理节点数据。
SAX解析XML的优点是占用较少内存空间,适合处理大型XML 文件。
然而,由于无法直接访问XML节点,只能顺序读取,因此对于树状结构的XML数据,处理起来较为繁琐。
3. StAX解析XMLStAX解析器是一种推拉模型的解析器,提供了流式的方式来解析XML文档。
StAX解析XML的原理如下:a) 逐行读取XML文档。
b) 根据节点的类型 (元素、属性、文本等) 来访问和操作XML数据。
StAX解析XML的优点是既可以随机访问XML节点,又可以按需读取XML数据,适合处理中型XML文件。
java中四种⽣成和解析XML⽂档的⽅法详解(介绍+优缺点⽐较+⽰例)众所周知,现在解析XML的⽅法越来越多,但主流的⽅法也就四种,即:DOM、SAX、JDOM和DOM4J下⾯⾸先给出这四种⽅法的jar包下载地址DOM:在现在的Java JDK⾥都⾃带了,在xml-apis.jar包⾥⼀、介绍及优缺点分析1. DOM(Document Object Model)DOM是⽤与平台和语⾔⽆关的⽅式表⽰XML⽂档的官⽅W3C标准。
DOM是以层次结构组织的节点或信息⽚断的集合。
这个层次结构允许开发⼈员在树中寻找特定信息。
分析该结构通常需要加载整个⽂档和构造层次结构,然后才能做任何⼯作。
由于它是基于信息层次的,因⽽DOM被认为是基于树或基于对象的。
【优点】①允许应⽤程序对数据和结构做出更改。
②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
【缺点】①通常需要加载整个XML⽂档来构造层次结构,消耗资源⼤。
2. SAX(Simple API for XML)SAX处理的优点⾮常类似于流媒体的优点。
分析能够⽴即开始,⽽不是等待所有的数据被处理。
⽽且,由于应⽤程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于⼤型⽂档来说是个巨⼤的优点。
事实上,应⽤程序甚⾄不必解析整个⽂档;它可以在某个条件得到满⾜时停⽌解析。
⼀般来说,SAX还⽐它的替代者DOM快许多。
选择DOM还是选择SAX?对于需要⾃⼰编写代码来处理XML⽂档的开发⼈员来说,选择DOM还是SAX解析模型是⼀个⾮常重要的设计决策。
DOM采⽤建⽴树形结构的⽅式访问XML⽂档,⽽SAX采⽤的是事件模型。
DOM解析器把XML⽂档转化为⼀个包含其内容的树,并可以对树进⾏遍历。
⽤DOM解析模型的优点是编程容易,开发⼈员只需要调⽤建树的指令,然后利⽤navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
Java动态⽣成和解析xml⽂件步骤详解⾸先声明,这个地⽅是利⽤dom4j进⾏解析和⽣成,需要⽤到dom4j的jar包,所以⾸先需要我们获取jar包:<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency>⽣成xml⽂件代码案列:package day12;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;/*** 写出XML⽂档*/public class WriteXmlDemo {public static void main(String[] args) {List<Emp> empList = new ArrayList<Emp>();empList.add(new Emp(1,"张三",22,"男",3000));empList.add(new Emp(2,"李四",23,"⼥",4000));empList.add(new Emp(3,"王五",24,"男",5000));empList.add(new Emp(4,"赵六",25,"⼥",6000));empList.add(new Emp(5,"钱七",26,"男",7000));empList.add(new Emp(6,"传奇",21,"男",8000));/** 写出XML⽂档的⼤致步骤* 1.创建空⽩⽂档对象Document* 2.向该⽂档中添加根元素* 3.按照规定的XML⽂档结构从根元素开始,逐级添加⼦元素,已完成该结构* 4.创建XMLWriter* 5.将Document对象写出成XML⽂档* 6.将XMLWriter关闭*///1Document doc = DocumentHelper.createDocument();/** 2.Element addElement(String name)* Document提供的该⽅法是⽤来向当前⽂档中添加给定名字的根元素。
java注解⽣成xml和包含CDATA问题百度java⽣成xml,有⼀⼤推的⽂章,主要的⽣成⽅式⼀种使⽤Dom4J ,还有⼀种使⽤Jdk⾃带注解类!下⾯主要整理我注解类的使⽤,(可以参考这篇⽂章)和xml中CDATA 问题的解决⽅法!1:要⽣成的xml原始⽂件!<?xml version="1.0" encoding="utf-8"?><item><id>35399645973</id><title><![CDATA[补⽔⾸选⽔密码⽔保湿美⽩护洗护组合三件]]> </title><category><![CDATA[美妆>保湿>洗护]]></category><url><![CDATA[/detail-35399645973]]> </url><url_wap><![CDATA[/de99645973]]> </url_wap><price>310</price><promotion_price>93.8</promotion_price><wap_price>85</wap_price><sub_item_ids><sub_item_id>35399645973_1</sub_item_id><sub_item_id>35399645973_2</sub_item_id><sub_item_id>35399645973_3</sub_item_id>……</sub_item_ids><detail><![CDATA[商品详情,⽀持html图⽂混排]]> </detail><status>1<status><pic_main><img><url><![CDATA[/10777829/T_400x400.jpg]]> </url><size>400x400</size></img></pic_main><pic_extra><img><url><![CDATA[/10777821_400x400.jpg]]> </url><size>400x400</size></img><img><url><![CDATA[/10777822_400x400.jpg]]> </url><size>400x400</size></img></pic_extra ></item>2:xml对应的model类!(1):FanLiProductInofMsg.javaimport java.util.List;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlElementWrapper;import javax.xml.bind.annotation.XmlRootElement;/**** @author aflyun* @date 2016.06.12**/@XmlRootElement(name="item")public class FanLiProductInofMsg {@XmlAttributeprivate String version;@XmlElementprivate String id;@XmlElementprivate String title;@XmlElementprivate String category;@XmlElementprivate String url;//Pc商品的url@XmlElement(name="url_wap")private String urlWap;//Wap商品的url url_wap@XmlElementprivate String price;@XmlElement(name="promotion_price")private String promotionPrice;//promotion_price@XmlElement(name="wap_price")private String wapPrice;//wap_price@XmlElementWrapper(name="sub_item_ids")@XmlElement(name="sub_item_id")private List<String> subItemIds;//sub_item_ids@XmlElementprivate String detail;//detail@XmlElementprivate String status;//status@XmlElementWrapper(name="pic_main")@XmlElement(name="img")private List<Img> mainImg;//pic_main@XmlElementWrapper(name="pic_extra")@XmlElement(name="img")private List<Img> extraImg;//pic_extrapublic void setVersion(String version) {this.version = version;}public void setId(String id) {this.id = id;}public void setTitle(String title) {this.title = title;}public void setCategory(String category) {this.category = category;}public void setUrl(String url) {this.url = url;}public void setUrlWap(String urlWap) {this.urlWap = urlWap;}public void setPrice(String price) {this.price = price;}public void setPromotionPrice(String promotionPrice) { this.promotionPrice = promotionPrice;}public void setWapPrice(String wapPrice) {this.wapPrice = wapPrice;}public void setSubItemIds(List<String> subItemIds) { this.subItemIds = subItemIds;}public void setDetail(String detail) {this.detail = detail;}public void setStatus(String status) {this.status = status;}public void setMainImg(List<Img> mainImg) {this.mainImg = mainImg;}public void setExtraImg(List<Img> extraImg) {this.extraImg = extraImg;}}(2):Img .javaimport javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;/**** @author aflyun* @date 2016.06.12**/@XmlRootElementpublic class Img {@XmlElement(name="url")private String url;@XmlElement(name="size")private String size;public void setUrl(String url) {this.url = url;}public void setSize(String size) {this.size = size;}}3:⽣成过程,已经CDATA问题处理!package com.dufy.test.xml;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileWriter;import java.io.PrintWriter;import java.util.ArrayList;import java.util.List;import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.transform.sax.SAXResult;import org.apache.xml.serialize.OutputFormat;import org.apache.xml.serialize.XMLSerializer;import org.junit.Test;import com.kuyu.b2b2c.product.fanli.vo.FanLiProductInofMsg; import com.kuyu.b2b2c.product.fanli.vo.Img;public class JuintXmlTest {private static Marshaller marshal;@Testpublic void testXml() throws Exception {List<String> list = new ArrayList<String>();list.add("11_11_11");list.add("22_22_22");list.add("33_33_33");List<Img> imgList = new ArrayList<Img>();Img img = null;for (int i = 0; i < 2; i++) {img = new Img();img.setUrl("-" + i + "-");img.setSize("40×40");imgList.add(img);}FanLiProductInofMsg fps = new FanLiProductInofMsg();fps.setVersion("1.0");fps.setId("110");fps.setTitle("4K ⾼清");fps.setCategory("电视>4K>⾼清");fps.setUrl("");fps.setUrlWap("");fps.setPrice("100");fps.setPromotionPrice("111");fps.setWapPrice("113");fps.setSubItemIds(list);fps.setDetail("wwwwwwwwwwwwwwwwwwwwwww");fps.setStatus("1");fps.setMainImg(imgList);fps.setExtraImg(imgList);PrintWriter pw = new PrintWriter(new File("D:/test.xml"));String ojbectToXmlWithCDATA = ojbectToXmlWithCDATA(FanLiProductInofMsg.class, fps);System.out.println(ojbectToXmlWithCDATA);pw.println(ojbectToXmlWithCDATA);pw.close();}public static String ojbectToXmlWithCDATA(Class clazz, Object obj) throws Exception {JAXBContext context = JAXBContext.newInstance(clazz);// configure an OutputFormat to handle CDATAOutputFormat of = new OutputFormat();of.setCDataElements(new String[] { "^title", //"^category","^url","^url_wap","^detail"}); //// set any other options you'd likeof.setPreserveSpace(true);of.setIndenting(true);// create the serializerByteArrayOutputStream op = new ByteArrayOutputStream();XMLSerializer serializer = new XMLSerializer(op, of);SAXResult result = new SAXResult(serializer.asContentHandler());Marshaller mar = context.createMarshaller();mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);mar.marshal(obj, result);return op.toString("utf-8");}}setCDataElements 这⾥⾯你标注需CDATA 的字段!上⾯的这个例⼦可以直接拷贝运⾏,⽹上还⼀些其他的⽅法⽣成xml和CDATA,如果你有好的⽅法,欢迎分享给我,谢谢!4:参考⽂章(1):(2):(3):欢迎访问我的csdn博客,我们⼀同成长!。
使用要导入dom4j-1.6.1.jar文件我的dom4j文件在讲解生成xml 1:先通过DocumentHelper类的.createDocument()方法生成Document文件2:接着通过DocumentHelper类的createElement("根节点字符串形式")创建根节点3:通过通过生成的Document的实例的setRootElement(根节点)设置根节点4:接着可以通过Document的实例的getRootElement()方法得到根节点5:接着通过根节点(Element类的实例)的.addElement("子节点的字符串形式")添加子节点6:通过节点类(Element类的实例)的setText("字符串“)设置节点对应的值7:通过Document类的实例的.asXML();的方式的得到xml字符串;(注意:xml 是字符串String的形式。
可以设置几个同名的根节点(<user>username1<user><<user>username2<user>)解析时通过Elment的.elementIterator("user");方法得到迭代器)解析xml 1:通过new SAXReader();得到SAXReader的一个实例2:通过StringReader(参数是字符串)将xml字符串转化为一个Reader字符输入流3:通过SAXReader的实例.read(参数是个Reader)得到得到Document4:通过Document的getRootElement()方法得到根节点(Element类的实例)5:通过根节点的element("子节点的字符串形式")方法得到子节点(若有多个同名子节点通过根节点的.elementIterator("user")得到同名节点迭代器)6:通过节点的getTxt();方法得到节点的值生成xml 例子:private static Document constructDocument()//此处会被下面调用{Document document = DocumentHelper.createDocument();Element root = DocumentHelper.createElement("message");document.setRootElement(root);return document;}document文件。
Java与XML的数据交互与解析方法XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有良好的可读性和可扩展性。
在Java开发中,XML常被用于数据交互和解析。
本文将介绍Java与XML的数据交互与解析方法,包括XML的基本概念、Java中的XML解析技术以及XML数据的生成和解析方法。
一、XML的基本概念XML是一种用于描述数据的标记语言,它使用标签来标识数据的结构和内容。
XML的基本组成部分包括标签、元素、属性和文本内容。
1. 标签:XML中使用尖括号(<>)来定义标签,标签用于标识数据的开始和结束位置。
例如:<book>...</book>。
2. 元素:元素是由开始标签和结束标签组成的标记对,用于表示数据的结构和层次关系。
例如:<title>Java与XML</title>。
3. 属性:属性用于描述元素的特性,属性由属性名和属性值组成,属性值必须用引号括起来。
例如:<book id="1">...</book>。
4. 文本内容:文本内容是元素中的实际数据,它位于开始标签和结束标签之间。
例如:<title>Java与XML</title>中的"Java与XML"就是文本内容。
二、Java中的XML解析技术在Java开发中,常用的XML解析技术包括DOM(文档对象模型)、SAX(简单API for XML)和JAXB(Java体系结构的XML绑定)。
1. DOM解析:DOM解析是将整个XML文档加载到内存中,以树形结构表示XML文档,通过操作树节点来访问和修改XML数据。
DOM解析适用于小型XML文档,但对大型XML文档的处理效率较低。
2. SAX解析:SAX解析是一种基于事件驱动的解析方式,通过逐行读取XML 文档并触发相应的事件来解析XML数据。
xml解析原理XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。
它具有自描述性、跨平台和可扩展的特点,被广泛应用于各种领域。
而在使用XML数据时,我们需要将其解析为计算机可以理解和处理的格式。
本文将介绍XML解析的原理以及常用的解析方法。
一、XML解析原理概述XML解析过程是将XML文档转化为计算机可以读取和操作的数据结构的过程。
XML解析器会按照一定的规则对XML文档进行解析,并将其转换为内存中的树形结构,常用的树形结构包括DOM(文档对象模型)和SAX(简单API for XML)。
DOM解析器会将整个XML文档加载到内存中,并构建一颗树形结构,开发者可以通过操作树节点的方式读取和修改XML数据。
DOM 解析器适用于XML文档较小的情况,但在处理大型XML文档时,会占用较大的内存资源。
SAX解析器则是一种基于事件驱动的解析方法,它不会将整个XML文档加载到内存中,而是顺序地读取XML文档,当遇到特定事件(如标签的开始和结束)时触发相应的处理方法。
SAX解析器适用于处理大型XML文档,但对于复杂的XML文档结构,操作起来相对繁琐。
二、DOM解析器DOM解析器是常用的XML解析方法之一。
其解析过程包括以下几个步骤:1. 加载XML文档:DOM解析器会读取XML文档,并将其加载到内存中。
2. 构建文档对象模型:解析器会根据XML文档的结构构建一颗树形结构,即文档对象模型。
树的每个节点代表XML文档中的一个元素、属性或文本。
3. 遍历和操作节点:开发者可以通过遍历和操作节点的方式读取和修改XML数据。
解析器提供了一系列的API方法,如获取节点的名称、值、属性等信息,以及增删改查节点等操作。
4. 释放内存资源:当完成对XML文档的操作后,解析器需要释放内存资源,以便其他程序或进程使用。
DOM解析器相对简单易用,适用于较小的XML文档。
但当XML文档较大时,会占用较多的内存资源,并且解析速度较慢。
Java XML处理解析和生成XML数据Java作为一种广泛使用的编程语言,提供了丰富的API和工具来处理和操作XML数据。
本文将介绍Java中处理和解析XML数据的基本方法,并探讨如何使用Java生成XML数据。
一、XML简介XML(可扩展标记语言)是一种用于描述数据的标记语言,它的设计目标是传输数据而不仅仅是显示数据。
XML以一种结构化的方式存储数据,使得数据具有良好的可读性和可扩展性。
二、XML解析XML解析是指将XML数据转换为Java程序可以理解和处理的格式。
Java提供了几种XML解析方法,包括DOM(文档对象模型)、SAX(简单API for XML)和StAX(流API for XML)。
1. DOM解析DOM解析是最常用和最常见的XML解析方法之一。
DOM将XML文档视为一个树形结构,通过解析整个文档并将其加载到内存中,以方便对数据的操作和访问。
使用DOM解析XML的基本步骤如下:(1)创建一个DocumentBuilder对象。
(2)使用DocumentBuilder对象的parse()方法解析XML文件,返回一个Document对象。
(3)通过Document对象获取XML文件中的节点和元素。
以下是一个使用DOM解析XML的示例代码:```DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("example.xml"));// 获取根节点Element rootElement = document.getDocumentElement();// 获取子节点NodeList nodeList = rootElement.getElementsByTagName("book");for (int i = 0; i < nodeList.getLength(); i++) {Element bookElement = (Element) nodeList.item(i);String title =bookElement.getElementsByTagName("title").item(0).getTextContent( );String author =bookElement.getElementsByTagName("author").item(0).getTextContent();System.out.println("Title: " + title + ", Author: " + author);}```2. SAX解析SAX解析是一种基于事件驱动的解析方法。
创建解析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"));}}}。
java xml相关操作
Java与XML的结合是一种常见的方式,可以实现数据的存储和传输。
以下是一些Java XML相关操作的详细介绍:
1. 解析XML文件:使用Java中的DOM、SAX或JDOM等API可以解析XML文件并获取其中的数据。
2. 创建XML文件:可以使用Java中的DOM或JDOM等API创建XML文件,并将数据写入其中。
3. 使用XML Schema验证XML文档:可以使用Java中的SAX或DOM API以及一些第三方库,如JAXB或XSDValidator等,来验证XML 文档是否符合XML Schema的规范。
4. 转换XML格式:可以使用Java中的XSLT API将XML文档转换为其他格式,如HTML、PDF等。
5. 使用XPath查询XML文档:可以使用Java中的XPath API来查询XML文档中的数据。
6. 使用JAXB绑定XML和Java对象:可以使用JAXB API将XML 文档中的数据绑定到Java对象上,并进行操作和修改。
7. 使用XML与Web服务交互:可以使用Java中的WebService API 来使用XML和Web服务交互,并获取和发送数据。
总之,Java与XML的结合可以实现许多功能,如数据存储、数据传输、Web服务交互等,是Java开发中的重要部分。
- 1 -。
java解析xml详解及示例java 解析xml的几种方法第一种:DOMDOM的全称是Document Object Model,也即文档对象模型。
在应用程序中,基于DOM 的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。
通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。
无论XML文档中所描述的是什么类型的信息,即便是制表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。
也就是说,DOM强制使用树模型来访问XML文档中的信息。
由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。
DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。
然而,由于DOM 分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。
而且,对于结构复杂的树的遍历也是一项耗时的操作。
所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。
不过,由于DOM分析器所采用的树结构的思想与XML 文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的。
Java代码import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class DomT est1{public static void main(String[] args) throws Exception{// step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器)DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();// System.out.println("class name: " + dbf.getClass().getName());// step 2:获得具体的dom解析器DocumentBuilder db = dbf.newDocumentBuilder();// System.out.println("class name: " + db.getClass().getName());// step3: 解析一个xml文档,获得Document对象(根结点)Document document = db.parse(new File("candidate.xml"));NodeList list = document.getElementsByTagName("PERSON");for(int i = 0; i < list.getLength(); i++){Element element = (Element)list.item(i);String content =element.getElementsByTagName("NAME").item(0).getFirstC hild().getNodeValue();System.out.println("name:" + content);content =element.getElementsByTagName("ADDRESS").item(0).getFir stChild().getNodeValue(); System.out.println("address:" + content);content =element.getElementsByTagName("TEL").item(0).getFirstChil d().getNodeValue();System.out.println("tel:" + content);content =element.getElementsByTagName("FAX").item(0).getFirstChil d().getNodeValue();System.out.println("fax:" + content);content =element.getElementsByTagName("EMAIL").item(0).getFirstC hild().getNodeValue();System.out.println("email:" + content);System.out.println("--------------------------------------");}}}Java代码import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Attr;import /doc/723478280.html,ment;import org.w3c.dom.Document;import org.w3c.dom.Element;import/doc/723478280.html,dNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;/*** 使用递归解析给定的任意一个xml文档并且将其内容输出到命令行上* @author*/public class DomT est3{public static void main(String[] args) throws Exception{DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.parse(new File("student.xml"));//获得根元素结点Element root = doc.getDocumentElement();parseElement(root);}private static void parseElement(Element element){String tagName = element.getNodeName();NodeList children = element.getChildNodes();System.out.print("<" + tagName);//element元素的所有属性所构成的NamedNodeMap对象,需要对其进行判断 NamedNodeMap map = element.getAttributes();//如果该元素存在属性if(null != map){{//获得该元素的每一个属性Attr attr = (Attr)map.item(i);String attrName = attr.getName();String attrValue = attr.getValue();System.out.print(" " + attrName + "=\"" + attrValue + "\""); } }System.out.print(">");for(int i = 0; i < children.getLength(); i++){Node node = children.item(i);//获得结点的类型short nodeType = node.getNodeType();if(nodeType == Node.ELEMENT_NODE){//是元素,继续递归parseElement((Element)node);}else if(nodeType == Node.TEXT_NODE){//递归出口System.out.print(node.getNodeValue());}else if(nodeType == /doc/723478280.html,MENT_NODE) {System.out.print("System.out.print(data);System.out.print("-->");}}System.out.print("");}}第二种 sax:SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。
java xml注解解析【原创实用版】目录1.Java 与 XML 的概述2.XML 注解的作用与分类3.Java 中 XML 注解的解析方法4.实例解析正文一、Java 与 XML 的概述Java 是一种广泛使用的编程语言,其具有跨平台、面向对象、易于维护等优点。
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。
Java 和 XML 在实际应用中往往需要结合使用,以便实现数据的交换和共享。
二、XML 注解的作用与分类XML 注解是一种用于描述 XML 文档结构和内容的元数据。
它有助于提高 XML 文档的可读性和可维护性。
XML 注解可以分为三类:1.通用注解:这类注解用于描述 XML 文档的一般特性,如文档类型声明(DTD)、XML 声明和过程指令等。
2.元数据注解:这类注解用于描述 XML 文档中的元数据,如作者、日期、标题等。
3.特殊注解:这类注解用于描述特定领域的 XML 文档,如地理信息系统(GIS)数据、化学信息等。
三、Java 中 XML 注解的解析方法Java 提供了多种 XML 注解解析方法,主要包括以下几种:1.DOM 解析:DOM(文档对象模型)是一种基于树结构的 XML 解析方法。
它将整个 XML 文档加载到内存中,形成一个树状结构,方便进行遍历和操作。
DOM 解析的优点是解析后的 XML 文档易于操作,缺点是内存消耗较大。
2.SAX 解析:SAX(简单 API)是一种基于事件的 XML 解析方法。
它一边读取 XML 文档,一边触发相应的事件,如元素开始、元素结束等。
SAX 解析的优点是内存消耗较小,缺点是解析后的 XML 文档不易操作。
3.JAXB 解析:JAXB(Java API for XML Binding)是一种基于 Java 对象的 XML 解析方法。
它将 XML 文档映射为 Java 对象,实现 XML 与Java 对象之间的互相转换。
JAXB 解析的优点是便于实现数据绑定,缺点是依赖于特定的 XML 模式。
Java中使⽤DOM4J来⽣成xml⽂件和解析xml⽂件⼀、前⾔现在有不少需求,是需要我们解析xml⽂件中的数据,然后导⼊到数据库中,当然解析xml⽂件也有好多种⽅法,⼩编觉得还是DOM4J⽤的最多最⼴泛也最好理解的吧.⼩编也是最近需求⾥遇到了,就来整理⼀下⾃⼰的理解,只适合刚刚学习的,⼀起理解!今天我们把解析xml⽂件和⽣成xml⽂件在⼀起来展⽰.⼆、准备依赖<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency>三、⽣成xml⽂件⽣成标准展⽰⽣成xml代码/*** 使⽤DOM4J⽣成xml⽅法*/public static void createXml(){try {// 创建document对象Document document = DocumentHelper.createDocument();// 创建根节点bookRootElement StudentRoot = document.addElement("StudentRoot");// 向根节点中添加第⼀个节点Element book1 = StudentRoot.addElement("student");// 向⼦节点中添加属性book1.addAttribute("id","1");// 向节点中添加⼦节点Element name = book1.addElement("name");// 向⼦节点赋值name.setText("⼩乔");Element price = book1.addElement("age");price.setText("18");// 向根节点中添加第⼆个节点Element book2 = StudentRoot.addElement("student");book2.addAttribute("id","2").addElement("name").setText("⼤桥");book2.addElement("age").setText("20");// 向根节点中添加第三个节点Element book3 = StudentRoot.addElement("student");book3.addAttribute("id","3").addElement("name").setText("孙策");book3.addElement("age").setText("21");// 设置⽣成xml的格式OutputFormat of = OutputFormat.createPrettyPrint();// 设置编码格式of.setEncoding("UTF-8");// ⽣成xml⽂件File file = new File("E:\\student.xml");if (file.exists()){file.delete();}//创建⼀个xml⽂档编辑器XMLWriter writer = new XMLWriter(new FileOutputStream(file), of);//把刚刚创建的document放到⽂档编辑器中writer.write(document);writer.close();} catch (Exception e) {e.printStackTrace();}}四、解析xml⽂件解析xml的⽂件就是刚刚导出的那个样⼦,我们展⽰两种情况,⼀个是知道属性名字和⼦元素名字的我们把解析的xml ⽂件数据放到实体类中.不知道的就直接打印到控制台.实体类展⽰import lombok.Data;@Datapublic class Student {private int id;private String name;private int age;}解析xml⽂件⽅法public static void analysis(){// 把要解析的xml变成file⽂件File file = new File("E:\\student.xml");// 获取解析器对象SAXReader reader = new SAXReader();// 把⽂件解析成document树Document document = null;try {document = reader.read(file);} catch (DocumentException e) {e.printStackTrace();}// 获取根节点Element studentRoot = document.getRootElement();// 获取根节点中所有节点List<Element> elements = studentRoot.elements();// 存放xml中节点的数据集合List<Student> list = new ArrayList<>();// 便利所有节点for (Element child : elements) {Student student = new Student();//已知属性名情况下student.setId(Integer.parseInt(child.attributeValue("id")));//获取属性的数据//已知⼦元素名的情况下student.setName(child.elementText("name"));//获取元素中值student.setAge(Integer.parseInt(child.elementText("age")));//获取元素中值list.add(student);//未知属性名情况下List<Attribute> attributes = child.attributes();for (Attribute attribute : attributes) {System.out.println(attribute.getName() + "---> " + attribute.getValue());}//未知⼦元素名情况下List<Element> elementList = child.elements();for (Element ele : elementList) {System.out.println(ele.getName() + "--->" + ele.getText());}}//把解析xml出来的数据集合打印list.forEach(x-> System.out.println(x));}解析结果展⽰五、总结这样我们就把DOM4J来⽣成xml⽂件和解析xml⽂件就都操作完成了,有什么问题留⾔哦!!谢谢⼤家。
javaDocument⽣成和解析xml Document场景:需要知道⽂档所有结构需要把⽂档⼀些元素排序⽂档中的信息被多次使⽤的情况优势:由于Document是java中⾃带的解析器,兼容性强缺点:由于Document是⼀次性加载⽂档信息,如果⽂档太⼤,不太适⽤Document操作步骤第⼀步:初始化xml解析⼯⼚DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();第⼆步:创建DocumentBuilderDocumentBuilder builder = factory.newDocumentBuilder();第三步:创建DocumentDocument doc = builder.newDocument();standalone⽤来表⽰该⽂件是否呼叫其它外部的⽂件。
若值是 ”yes” 表⽰没有呼叫外部⽂件doc.setXmlStandalone(true);第四步:创建节点Element element = doc.createElement("root");element.setAttribute("attr", "root");//设置节点属性childTwoTwo.setTextContent("root attr");//设置标签之间的内容第五步:把节点添加到Documentdoc.appendChild(element);第六步:把xml内容输出到具体的⽂件中,见下⾯代码Document⽣成xmlpackage com.xm.xml.document;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException;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;/*** java document⽣成xml* @author ouyangjun*/public class CreateDocument {public static void main(String[] args) {// 调⽤xml⽣成⽅法createDocument(new File("E:\\person.xml"));}public static void createDocument(File file){try {// 初始化xml解析⼯⼚DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 创建DocumentBuilderDocumentBuilder builder = factory.newDocumentBuilder();// 创建DocumentDocument doc = builder.newDocument();// standalone⽤来表⽰该⽂件是否呼叫其它外部的⽂件。
Java中构造、⽣成XML简明教程本⽂介绍在Java编程时,如何快速的构造⼀个XML⽚段,然后再将这个XML输出出来。
在⽇常使⽤Java开发时,经常会⽤到XML。
XML⽤起来好⽤,但写起来烦,有没有很简单的构造与输出⽅法呢?且往下看。
1、导⼊jar包与命名空间要在Java中使⽤XML,建议先导⼊⼀个jar包——dom4j。
这是⼀个专门⽤于处理XML的jar包,⾮常好⽤。
然后import下⾯这三个类:复制代码代码如下:import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;2、定义XML架构在往XML⽚段⾥⾯写东西之前,先要创建⼀个XML⽚段,或者说XML Document。
如下程序中,先创建⼀个Document对象,然后在它上⾯创建⼀个根元素(Element)。
复制代码代码如下:Document document = DocumentHelper.createDocument();Element root = document.addElement("return");3、添加⼦节点有了根节点元素后,下⾯就可以往它上⾯添加⼦节点了。
复制代码代码如下:Element returnvalue = root.addElement("returnvalue");Element returninfo = root.addElement("returninfo");4、为⼦节点添加内容可以为已经创建的⼦节点添加内容:复制代码代码如下:returnvalue.addText("false");returninfo.addText("get-session-fail");也可以创建⼦节点的同时添加内容:复制代码代码如下:root.addElement("id").addText("12345");注意,在使⽤addText来添加节点⽂本内容时,有时候我们会直接将变量作为函数的参数。
浅谈⽤java解析xml⽂档(⼀) 关于xml本⾝的语法及使⽤的环境不多说了,⽹上有很多规则, 然对xml⽂档进⾏解析,⼀般分为四种解析⽅式,基于java官⽅⽂档的Dom 和Sax解析,还有就是基于第三⽅jar包的 Jdom 和 Dom4j解析。
⼀、⾸先我们来看Dom解析: 1、定义⼯⼚,使应⽤程序能够从 XML ⽂档获取⽣成 DOM 对象树的解析器。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 在应⽤程序获取对DocumentBuilderFactory的引⽤后,它可以使⽤⼯⼚来配置和获取解析器实例。
使⽤DocumentBuilderFactory的⽬的是为了创建与具体解析器⽆关的程序,当DocumentBuilderFactory类的静态⽅法 newInstance()被调⽤时,它根据⼀个系统变量来决定具体使⽤哪⼀个解析器。
2、获取具体的dom解析器。
DocumentBuilder db = dbf.newDocumentBuilder(); 当获得⼀个⼯⼚对象之后,使⽤它的静态⽅法newDocumentBuilder(),可以获得⼀个DocumentBuilder对象。
这个对象代表了具体的DOM解析器。
解析器的具体实现对于程序来说并不重要。
然后我们就可以使⽤这个解析器对xml⽂档进⾏解析。
3、解析⼀个xml⽂档,获得document对象,以books.xml为例 Document document = db.parse("books.xml"); 根据标签名访问⼀个节点。
NodeList bookList = document.getElementsByTagName("book"); 4、遍历节点 for (int i = 0; i < bookList.getLength(); i++) { //获得元素,将节点强制转换为元素 Element element = (Element)bookList.item(i) } 操作⼦节点的元素:element.getElementsByTagName("节点名").item(0) 获取⼦节点value值可以使⽤getFirstChild().getNodeValue() ⽅法,具体可以查看API帮助⽂档进⾏操作。
Java中对XML的解析详解个⼈理解类似.net的XmlDocument,解析的时候效率不⾼,占⽤内存,不适合⼤XML的解析;基于事件的解析,当解析到xml的某个部分的时候,会触发特定事件,可以在⾃定义的解析类中定义当事件触发时要做得事情;个⼈感觉⼀种很另类的⽅式,不知道.Net体系下是否有没有类似的⽅式?个⼈理解类似.net的XmlReader⽅式,效率⾼,占⽤内存少,适⽤⼤XML的解析;不过SAX⽅式之前也⽤过,本⽂主要介绍JAXB,这⾥只贴下主要代码:复制代码代码如下:import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class ConfigParser extends DefaultHandler {private String currentConfigSection;public SysConfigItem sysConfig;public List<InterfaceConfigItem> interfaceConfigList;public List<FtpConfigItem> ftpConfigList;public List<AdapterConfigItem> adapterConfigList;public void startDocument() throws SAXException {sysConfig = new SysConfigItem();interfaceConfigList = new ArrayList<InterfaceConfigItem>();ftpConfigList = new ArrayList<FtpConfigItem>();adapterConfigList = new ArrayList<AdapterConfigItem>();}public void endDocument() throws SAXException {}public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if (qName.equalsIgnoreCase("Item") && attributes.getLength() > 0) {if (currentConfigSection.equalsIgnoreCase("SysConfigItem")) {sysConfig = new SysConfigItem(attributes);} else if (currentConfigSection.equalsIgnoreCase("InterfaceConfigItems")) {interfaceConfigList.add(new InterfaceConfigItem(attributes));} else if (currentConfigSection.equalsIgnoreCase("FtpConfigItems")) {ftpConfigList.add(new FtpConfigItem(attributes));} else if (currentConfigSection.equalsIgnoreCase("AdapterConfigItems")) {adapterConfigList.add(new AdapterConfigItem(attributes));}} else {currentConfigSection = qName;}}public void endElement(String uri, String localName, String qName) throws SAXException {}public void characters(char ch[], int start, int length) throws SAXException {}}复制代码代码如下:import ng.reflect.Field;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import org.xml.sax.Attributes;public class ConfigItemBase {private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public ConfigItemBase() {}/*** ⽬前只⽀持⼏种常⽤类型如果需要⽀持其他类型,请修改这⾥的代码** @param attributes*/public ConfigItemBase(Attributes attributes) {Class<?> cls = this.getClass();Field[] fields = cls.getDeclaredFields();for (Field field : fields) {String fieldType = field.getType().getSimpleName();for (int i = 0; i < attributes.getLength(); i++) {if (attributes.getQName(i).equalsIgnoreCase(field.getName())) {field.setAccessible(true);try {if (fieldType.equalsIgnoreCase("String")) {field.set(this, attributes.getValue(attributes.getQName(i)));} else if (fieldType.equalsIgnoreCase("Integer")) {field.set(this, Integer.valueOf(attributes.getValue(attributes.getQName(i))));} else if (fieldType.equalsIgnoreCase("Double")) {field.set(this, Double.valueOf(attributes.getValue(attributes.getQName(i))));} else if (fieldType.equalsIgnoreCase("Date")) {field.set(this, GetDate(attributes.getValue(attributes.getQName(i))));} else {System.out.println("Warning:Unhandler Field(" + field.getName() + "-" + fieldType + ")");}} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}break;}}}}public String toString() {String result = "";Class<?> cls = this.getClass();String classNameString = cls.getName();result += classNameString.substring(stIndexOf('.') + 1, classNameString.length()) + ":"; Field[] fields = cls.getDeclaredFields();for (Field field : fields) {try {result += field.getName() + "=" + field.get(this) + ";";} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}return result;}/*** 处理时间类型属性(时间格式要求为:yyyy-MM-dd hh:mm:ss)** @param dateString* @return*/private static Date GetDate(String dateString) {Date date = null;try {date = dateFormat.parse(dateString);} catch (ParseException e) {e.printStackTrace();}return date;}}JAXB(Java Architecture for XML Binding)这⾥⽤⽐较复杂的移动BatchSyncOrderRelationReq接⼝XML做为⽰例(感觉能解这个⼤家基本上够⽤了),报⽂格式如下(SvcCont⾥的CDATA内容是报⽂体,太恶⼼了):复制代码代码如下:<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><InterBOSS><Version>0100</Version><TestFlag>0</TestFlag><BIPType><BIPCode>BIP2B518</BIPCode><ActivityCode>T2101518</ActivityCode><ActionCode>0</ActionCode></BIPType><RoutingInfo><OrigDomain>BOSS</OrigDomain><RouteType>routeType</RouteType><Routing><HomeDomain>XXXX</HomeDomain><RouteValue>routeValue</RouteValue></Routing></RoutingInfo><TransInfo><SessionID>2013041017222313925676</SessionID><TransIDO>2013041017222313925676</TransIDO><TransIDOTime>20130410172223</TransIDOTime><TransIDH></TransIDH><TransIDHTime></TransIDHTime></TransInfo><SNReserve><TransIDC></TransIDC><ConvID></ConvID><CutOffDay></CutOffDay><OSNTime></OSNTime><OSNDUNS></OSNDUNS><HSNDUNS></HSNDUNS><MsgSender></MsgSender><MsgReceiver></MsgReceiver><Priority></Priority><ServiceLevel></ServiceLevel><SvcContType></SvcContType></SNReserve><Response><RspType>rspType</RspType><RspCode>rspCode</RspCode><RspDesc>rspDesc</RspDesc></Response><SvcCont><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <batchSyncOrderRelationReq><msgTransactionID>210001BIP2B518130410172223651627</msgTransactionID> <reqNum>2</reqNum><reqBody><oprNumb>210001BIP2B518130410172224341871</oprNumb><subscriptionInfo><oprTime>oprTime1</oprTime><actionID>actionId1</actionID><brand>brand1</brand><effTime>effTime1</effTime><expireTime>expireTime1</expireTime><feeUser_ID>feeUserId1</feeUser_ID><destUser_ID>destUserId1</destUser_ID><actionReasonID>actionId1</actionReasonID><servType>servType1</servType><subServType>subServType1</subServType><SPID>spId1</SPID><SPServID>spServId1</SPServID><accessMode>accessMode1</accessMode><servParamInfo><para_num>0</para_num><para_info><para_name></para_name><para_value></para_value></para_info></servParamInfo><feeType>feeType1</feeType></subscriptionInfo></reqBody><reqBody><oprNumb>210001BIP2B518130410172224420909</oprNumb><subscriptionInfo><oprTime>oprTime2</oprTime><actionID>actionId2</actionID><brand>brand2</brand><effTime>effTime2</effTime><expireTime>expireTime2</expireTime><feeUser_ID>feeUserId2</feeUser_ID><destUser_ID>destUserId2</destUser_ID><actionReasonID>actionId2</actionReasonID><servType>servType2</servType><subServType>subServType2</subServType><SPID>spId2</SPID><SPServID>spServId2</SPServID><accessMode>accessMode2</accessMode><servParamInfo><para_num>0</para_num><para_info><para_name></para_name><para_value></para_value></para_info></servParamInfo><feeType>feeType2</feeType></subscriptionInfo></reqBody></batchSyncOrderRelationReq>]]></SvcCont></InterBOSS>解码代码如下:复制代码代码如下:@XmlRootElement(name = "batchSyncOrderRelationReq")@XmlAccessorType(XmlAccessType.FIELD)public class BatchSyncOrderRelationReq extends BossMessage<BatchSyncOrderRelationReq> {@XmlElement(name = "msgTransactionID")private String msgTransactionId = "";@XmlElement(name = "reqNum")private String reqNum = "";@XmlElement(name = "reqBody")private List<BatchSyncOrderRelationReqBody> reqBodyList;public BatchSyncOrderRelationReq() {}public String getMsgTransactionId() {return this.msgTransactionId;}public void setMsgTransactionId(String msgTransactionId) {this.msgTransactionId = msgTransactionId;}public String getReqNum() {return this.reqNum;}public void setReqNum(String reqNum) {this.reqNum = reqNum;}public List<BatchSyncOrderRelationReqBody> getReqBodyList() {return this.reqBodyList;}public void setReqBodyList(List<BatchSyncOrderRelationReqBody> reqBodyList) {this.reqBodyList = reqBodyList;}@Overridepublic BatchSyncOrderRelationReq Deserialized(String interBossXmlContent) throws BusinessException { try {// deserialized for headJAXBContext jaxbCxt4Head = JAXBContext.newInstance(MessageHead.class);Unmarshaller unmarshaller4Head = jaxbCxt4Head.createUnmarshaller();MessageHead head = (MessageHead) unmarshaller4Head.unmarshal(new StringReader(interBossXmlContent)); // deserialized for SyncOrderRelationReq bodyJAXBContext jaxbCxt4Body = JAXBContext.newInstance(BatchSyncOrderRelationReq.class);Unmarshaller unmarshaller4Body = jaxbCxt4Body.createUnmarshaller();BatchSyncOrderRelationReq batchSyncOrderRelationReq = (BatchSyncOrderRelationReq)unmarshaller4Body.unmarshal(new StringReader(head.getSvcCont().trim()));batchSyncOrderRelationReq.setHead(head);return batchSyncOrderRelationReq;} catch (JAXBException e) {throw new BusinessException("SyncOrderRelationReq.Deserialized() Error!(" + interBossXmlContent + ")", e);}}}复制代码代码如下:@XmlAccessorType(XmlAccessType.FIELD)public class BatchSyncOrderRelationReqBody {@XmlElement(name = "oprNumb")private String oprNumb = "";@XmlElement(name = "subscriptionInfo")private SubscriptionInfo subscriptionInfo;public BatchSyncOrderRelationReqBody(){}public BatchSyncOrderRelationReqBody(String oprNumb, SubscriptionInfo subscriptionInfo) {this.oprNumb = oprNumb;this.subscriptionInfo = subscriptionInfo;}public String getOprNumb() {return this.oprNumb;}public void setOprNumb(String oprNumb) {this.oprNumb = oprNumb;}public SubscriptionInfo getSubscriptionInfo() {return this.subscriptionInfo;}public void setSubscriptionInfo(SubscriptionInfo subscriptionInfo) {this.subscriptionInfo = subscriptionInfo;}}复制代码代码如下:@XmlAccessorType(XmlAccessType.FIELD)public class SubscriptionInfo {@XmlElement(name = "oprTime")private String oprTime = "";@XmlElement(name = "actionID")private String actionId = "";@XmlElement(name = "brand")private String brand = "";@XmlElement(name = "effTime")private String effTime = "";@XmlElement(name = "expireTime")private String expireTime = "";@XmlElement(name = "feeUser_ID")private String feeUserId = "";@XmlElement(name = "destUser_ID")private String destUserId = "";@XmlElement(name = "actionReasonID") private String actionReasonId = "";@XmlElement(name = "servType")private String servType = "";@XmlElement(name = "subServType") private String subServType = "";@XmlElement(name = "SPID")private String spId = "";@XmlElement(name = "SPServID")private String spServId = "";@XmlElement(name = "accessMode")private String accessMode = "";@XmlElement(name = "feeType")private String feeType = "";public SubscriptionInfo() {}public SubscriptionInfo(String oprTime,String actionId,String brand,String effTime,String expireTime,String feeUserId,String destUserId,String actionReasonId,String servType,String subServType,String spId,String spServId,String accessMode,String feeType) {this.oprTime = oprTime;this.actionId = actionId;this.brand = brand;this.effTime = effTime;this.expireTime = expireTime;this.feeUserId = feeUserId;this.destUserId = destUserId;this.actionReasonId = actionReasonId;this.servType = servType;this.subServType = subServType;this.spId = spId;this.spServId = spServId;this.accessMode = accessMode;this.feeType = feeType;}public String getOprTime() {return this.oprTime;}public void setOprTime(String oprTime) {this.oprTime = oprTime;}public String getActionId() {return this.actionId;}public void setActionId(String actionId) {this.actionId = actionId;}public String getBrand() {return this.brand;}public void setBrand(String brand) {this.brand = brand;}public String getEffTime() {return this.effTime;}public void setEffTime(String effTime) {this.effTime = effTime;}public String getExpireTime() {return this.expireTime;}public void setExpireTime(String expireTime) { this.expireTime = expireTime;}public String getFeeUserId() {return this.feeUserId;}public void setFeeUserId(String feeUserId) { this.feeUserId = feeUserId;}public String getDestUserId() {return this.destUserId;}public void setDestUserId(String destUserId) { this.destUserId = destUserId;}public String getActionReasonId() {return this.actionReasonId;}public void setActionReasonId(String actionReasonId) { this.actionReasonId = actionReasonId;}public String getServType() {return this.servType;}public void setServType(String servType) {this.servType = servType;}public String getSubServType() {return this.subServType;}public void setSubServType(String subServType) {this.subServType = subServType;}public String getSpId() {return this.spId;}public void setSpId(String spId) {this.spId = spId;}public String getSpServId() {return this.spServId;}public void setSpServId(String spServId) {this.spServId = spServId;}public String getAccessMode() {return this.accessMode;}public void setAccessMode(String accessMode) {this.accessMode = accessMode;}public String getFeeType() {return this.feeType;}public void setFeeType(String feeType) {this.feeType = feeType;}}。
使用要导入dom4j-1.6.1.jar文件
我的dom4j文件在
讲解
生成xml 1:先通过DocumentHelper类的.createDocument()方法生成Document文件2:接着通过DocumentHelper类的createElement("根节点字符串形式")创建根节点
3:通过通过生成的Document的实例的setRootElement(根节点)设置根节点
4:接着可以通过Document的实例的getRootElement()方法得到根节点
5:接着通过根节点(Element类的实例)的.addElement("子节点的字符串形式")添加子节点
6:通过节点类(Element类的实例)的setText("字符串“)设置节点对应的值
7:通过Document类的实例的.asXML();的方式的得到xml字符串;
(注意:xml 是字符串String的形式。
可以设置几个同名的根节点(<user>username1<user><<user>username2<user>)
解析时通过Elment的.elementIterator("user");方法得到迭代器
)
解析xml 1:通过new SAXReader();得到SAXReader的一个实例
2:通过StringReader(参数是字符串)将xml字符串转化为一个Reader字符输入流
3:通过SAXReader的实例.read(参数是个Reader)得到得到Document
4:通过Document的getRootElement()方法得到根节点(Element类的实例)
5:通过根节点的element("子节点的字符串形式")方法得到子节点
(若有多个同名子节点通过根节点的.elementIterator("user")得到同名节点迭代器)6:通过节点的getTxt();方法得到节点的值
生成xml 例子:
private static Document constructDocument()//此处会被下面调用
{
Document document = DocumentHelper.createDocument();
Element root = DocumentHelper.createElement("message");
document.setRootElement(root);
return document;
}
document文件。
结果是下面的形式
<message>
</message>
将字符串转化成一个xml文件的一部分
public static String constructLoginXML(String username)
{
Document document = constructDocument();//调用上面个的方法
Element root = document.getRootElement();
Element type = root.addElement("type");
type.setText("1");
Element user = root.addElement("user");
user.setText(username);
return document.asXML();
}
<message>
<type>1</type>
<user>参数username</user>
</message>
解析xml 例子:
public static String extractUsername(String xml){
try{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new StringReader(xml));
Element user = document.getRootElement().element("user");
return user.getText();
}
catch(Exception ex){
}
return null;
}。