使用JDOM管理XML
- 格式:ppt
- 大小:110.00 KB
- 文档页数:11
一、JDOM 简介JDOM是一个开源项目,它基于树型结构,利用纯JA V A的技术对XML文档实现解析、生成、序列化以及多种操作。
JDOM 直接为JA V A编程服务。
它利用更为强有力的JA V A语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。
在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。
利用JDOM处理XML文档将是一件轻松、简单的事。
JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter开发出来,以弥补DOM及SAX 在实际应用当中的不足之处。
这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说,JA V A程序员在使用时来用起来总觉得不太方便。
DOM的缺点主要是来自于由于Dom是一个接口定义语言(IDL),它的任务是在不同语言实现中的一个最低的通用标准,并不是为JA V A特别设计的。
JDOM的最新版本为JDOM Beta 9。
最近JDOM被收录到JSR-102内,这标志着JDOM成为了JA V A平台组成的一部分。
二、JDOM 包概览JDOM是由以下几个包组成的org.jdom 包含了所有的xml文档要素的java类org.jdom.adapters 包含了与dom适配的java类org.jdom.filter 包含了xml文档的过滤器类org.jdom.input 包含了读取xml文档的类org.jdom.output 包含了写入xml文档的类org.jdom.transform 包含了将jdom xml文档接口转换为其他xml文档接口org.jdom.xpath 包含了对xml文档xpath操作的类三、JDOM 类说明1、org.JDOM这个包里的类是你J解析xml文件后所要用到的所有数据类型。
AttributeCDA TAComentDocTypeDocumentElementEntityRefNamespaceProscessingInstructionText2、org.JDOM.transform在涉及xslt格式转换时应使用下面的2个类JDOMSourceJDOMResultorg.JDOM.input3、输入类,一般用于文档的创建工作SAXBuilderDOMBuilderResultSetBuilderorg.JDOM.output4、输出类,用于文档转换输出XMLOutputterSAXOutputterDomOutputterJTreeOutputter使用前注意事项:1.JDOM对于JAXP 以及TRax 的支持JDOM 支持JAXP1.1:你可以在程序中使用任何的parser工具类,默认情况下是JAXP的parser。
(四)使⽤JDOM读、写xml⽂件JDOM=DOM修改⽂件的优点+SAX读取快速的优点// 1.⽣成xml⽂件import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.List;import org.jdom2.Attribute;import org.jdom2.Document;import org.jdom2.Element;import org.jdom2.input.SAXBuilder;import org.jdom2.output.XMLOutputter;public static void main(String[] args) { Element addresslist = new Element("addresslist"); // 定义根节点 Element linkman = new Element("linkman"); // 定义节点名称 Element name = new Element("name"); // 定义节点名称 Element email = new Element("email"); // 定义节点名称 Attribute id = new Attribute("id", "mxzer"); // 定义属性 Document document = new Document(addresslist); // 定义⼀个Document对象 name.setText("mxzer"); // 设置元素内容 email.setText("mxzer3200@"); name.setAttribute(id); // 设置name元素的属性 linkman.addContent(name); // 设置linkman的⼦节点 linkman.addContent(email); addresslist.addContent(linkman); // 将linkman加⼊根节点下 XMLOutputter out = new XMLOutputter(); // 输出xml⽂件 out.setFormat(out.getFormat().setEncoding("GBK")); // 设置输出编码 try { out.output(document, new FileOutputStream("e:" + File.separator+ "jdom2.xml")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}2.解析xml⽂件/*** 在JDOM中,所有节点都是以集合的形式返回的,集合中的每⼀个对象都是Element实例.** @param args* @throws Exception*/public static void main(String[] args) throws Exception { // 1.建⽴SAX解析 SAXBuilder builder = new SAXBuilder(); // 2.找到Document⽂档 Document dc = builder.build("e:" + File.separator + "jdom2.xml"); // 3.读取根元素 Element stu = dc.getRootElement(); // 得到全部的linkman⼦元素 List list = stu.getChildren("linkman"); for (int x = 0; x < list.size(); x++) { // 输出 Element ele = (Element) list.get(x); // 取出每⼀个⼦元素 String name = ele.getChildText("name"); // 取得name元素的内容 String id = ele.getChild("name").getAttribute("id").getValue(); // 取得name元素的id属性 String email = ele.getChildText("email"); System.out.println("联系⼈信息:"); System.out.println("姓名:" + name + ", id:" + id); System.out.println("邮箱:" + email); System.out.println("------------------------------"); }}。
遍历xml所有节点采⽤dom4j,jdom项⽬中做消息签名验证需要将xml各个节点值相加,采⽤dom4j和jdom分别实现。
dom4j:Java代码1. import org.dom4j.Document;2. import org.dom4j.DocumentException;3. import org.dom4j.DocumentHelper;4. import org.dom4j.Element;Java代码1. String xml="<?xml version=\"1.0 \" encoding=\"UTF-8\"><Order><Cid>456</Cid><Pwd& gt;密码</Pwd><Pid>商品单号</Pid><Price>商品价格< /Price></Order>";2.3. try {4. Document doc = DocumentHelper.parseText(xml);5. SAXReader reader = new SAXReader();6.7. Element el=doc.getRootElement();8. for(Iterator it=el.elementIterator();it.hasNext();){9. Element element = (Element) it.next();10. System.out.println(element.getText());11. }12. } catch (DocumentException e) {13. // TODO Auto-generated catch block14. e.printStackTrace();15. }jdom实现如下:Java代码1. import org.jdom.Document;2. import org.jdom.Element;3. import org.jdom.JDOMException;4. import space;5. import org.jdom.input.SAXBuilder;6.7. public List xmlElements(String xmlDoc) {8.9. //创建⼀个新的字符串10. StringReader read = new StringReader(xmlDoc);11. //创建新的输⼊源SAX 解析器将使⽤ InputSource 对象来确定如何读取 XML 输⼊12. InputSource source = new InputSource(read);13. //创建⼀个新的SAXBuilder14. SAXBuilder sb = new SAXBuilder();15. try {16. //通过输⼊源构造⼀个Document17. Document doc = sb.build(source);18. //取的根元素19. Element root = doc.getRootElement();20. //得到根元素所有⼦元素的集合21. List jiedian = root.getChildren();22. //获得XML中的命名空间(XML中未定义可不写)23. Namespace ns = root.getNamespace();24. Element et = null;25. for(int i=0;i<jiedian.size();i++){26. et = (Element) jiedian.get(i);//循环依次得到⼦元素27. System.out.println(et.getValue());28. }29. }30. } catch (JDOMException e) {31. // TODO ⾃动⽣成 catch 块32. e.printStackTrace();33. } catch (IOException e) {34. // TODO ⾃动⽣成 catch 块35. e.printStackTrace();36. }37. return null;38. }39. public static void main(String[] args) throws Exception{40. String xml0="<?xml version=\"1.0 \" encoding=\"UTF-8\"?><Order><Cid>456</Cid>< Pwd>密码</Pwd><Pid>商品单号< /Pid><Prices><Price>商品价格01</Price><Price>商品价格 02</Price></Prices></Order>";41. doc.xmlElements(xml0);42.43. }以上只能实现树结构2层的XML,以下递归出多层XML节点值:Java代码1. public static String getXmlElmentValue(String xml){2. StringBuffer str=new StringBuffer();3. try {4. org.dom4j.Document doc= DocumentHelper.parseText(xml);5. org.dom4j.Element el=doc.getRootElement();6. return recGetXmlElementValue(el,str).toString();7. } catch (DocumentException e) {8. e.printStackTrace();9. return null;10. }11. }12.13. private static StringBuffer recGetXmlElementValue(org.dom4j.Element ele,StringBuffer valueBuff){14. List eleList = ele.elements();15. if(eleList.size()==0){16. valueBuff.append(ele.getText().replaceAll("[\n-\r]", ""));17. return valueBuff;18. }else{19. for(Iterator<org.dom4j.Element> iter = eleList.iterator();iter.hasNext();){20. org.dom4j.Element innerEle = iter.next();21. recGetXmlElementValue(innerEle,valueBuff);22. }23. return valueBuff;24. }25. }。
写xmlpackage com.hdz.xml;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import org.jdom.Document;import org.jdom.Element;import org.jdom.output.Format;import org.jdom.output.XMLOutputter;public class TestWriteXml {/***写XML by jdom*@param args*/public static void main(String[] args) {try {//输出文件路径String filePath = "c:\\hdz.xml";FileOutputStream out = new FileOutputStream(filePath);//创建根元素Element records = new Element("Records");//设置文档的根元素Document doc = new Document(records);//创建子元素记录Element record = new Element("Record");//创建子元素内容Element name = new Element("Name");name.setText("管理员");record.addContent(name);Element address = new Element("Address");address.setText("北京");record.addContent(address);record.setAttribute("INDEX", "1");records.addContent(record);records.setAttribute("COUNTS","1");//格式化XMLFormat format = Format.getCompactFormat();format.setEncoding("UTF-8");//设置缩进为4个空格format.setIndent(" ");//输出XMLXMLOutputter XMLOut = new XMLOutputter(format);XMLOut.output(doc, out);System.out.println("write xml success");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}读xmlpackage com.hdz.xml;import java.io.IOException;import java.util.Iterator;import java.util.List;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;public class TestReadXml {/***解析XML by jdom*@param args*/public static void main(String[] args) {try {String filePath = "c:\\hdz.xml";SAXBuilder builder = new SAXBuilder();Document doc = builder.build(filePath);Element root = doc.getRootElement();List<Element> records = root.getChildren("Record");for(Iterator<Element> it = records.iterator();it.hasNext();){Element element = it.next();List<Element> fields = element.getChildren();for(Iterator<Element> itFields = fields.iterator();itFields.hasNext();){Element fieldEle = itFields.next();System.out.println("name:"+fieldEle.getName()+",value:"+fieldEle.getTextTrim());}}} catch (JDOMException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}。
jdom解析xml这次把代码整理了⼀下,打包发上来了,程序中需要⽤到的jar包也⼀起打在⾥⾯了,有兴趣的朋友可以解压后直接导⼊的eclipse⾥运⾏! xml是⼀种⼴为使⽤的可扩展标记语⾔,java中解析xml的⽅式有很多,最常⽤的像jdom、dom4j、sax等等。
前两天刚好有个程序需要解析xml,就学了下jdom,写了个⼩例⼦,这⾥做个学习笔记。
要使⽤jdom解析xml⽂件,需要下载jdom的包,我使⽤的是jdom-1.1。
解压之后,将lib⽂件夹下的.jar⽂件以及build⽂件夹下的jdom.jar拷贝到⼯程⽂件夹下,然后就可以使⽤jdom操作xml⽂件了。
⼀、读取xml⽂件假设有这样⼀个xml⽂件:Xml代码1. <?xml version="1.0" encoding="UTF-8"?>2. <sys-config>3. <jdbc-info>4. <driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name>5. <url>jdbc:oracle:thin:@localhost:1521:database</url>6. <user-name>why</user-name>7. <password>why</password>8. </jdbc-info>9. <provinces-info>10. <province id="hlj" name="⿊龙江">11. <city id="harb">哈尔滨</city>12. <city id="nj">嫩江</city>13. </province>14. <province id="jl" name="吉林"></province>15. </provinces-info>16. </sys-config>⾸先,⽤ org.jdom.input.SAXBuilder 这个类取得要操作的xml⽂件,会返回⼀个 org.jdom.Document 对象,这⾥需要做⼀下异常处理。
jdom学习读取XML文件用JDOM读取XML文件需先用org.jdom.input.SAXBuilder对象的build()方法创建Document对象,然后用Document类、Element类等的方法读取所需的内容。
例如:<?xml version="1.0" encoding="UTF-8"?><HD><disk name="C"><capacity>8G</capacity><directories>200</directories><files>1580</files></disk><disk name="D"><capacity>10G</capacity><directories>500</directories><files>3000</files></disk></HD>则解析类:import java.util.*;import org.jdom.*;import org.jdom.input.SAXBuilder;publicclass Sample {publicstaticvoid main(String[] args) throws Exception{SAXBuildersb=new SAXBuilder();Documentdoc=sb.build(Sample.class.getClassLoader().getResourceAsStream("test. xml")); //构造文档对象Element root=doc.getRootElement(); //获取根元素List list=root.getChildren("disk");//取名字为disk的所有元素for(int i=0;i<list.size();i++){Element element=(Element)list.get(i);String name=element.getAttributeValue("name");String capacity=element.getChildText("capacity");//取disk子元素capacity的内容String directories=element.getChildText("directories");String files=element.getChildText("files");System.out.println("磁盘信息:");System.out.println("分区盘符:"+name);System.out.println("分区容量:"+capacity);System.out.println("目录数:"+directories);System.out.println("文件数:"+files);System.out.println("-----------------------------------"); }}}在写类时,会报错一些类找不到,此时需要将jdom.jar包jdom.jar,导入进去:导入步骤为:。
1.WriteXml.java:代码如下:package .csrc.xml;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Arrays;import java.util.List;import org.jdom2.Document;import org.jdom2.Element;import org.jdom2.output.Format;import org.jdom2.output.XMLOutputter;import .csrc.jdbc.DatabaseConnection;/*** @function 使用Jdom查询数据库把数据写入xml文件中* @author admin**/public class WriteXml {public static void WriterFileToXml(){//创建一个xml文件File file = new File("D://user.xml");//创建数据库连接Connection conn = DatabaseConnection.getConn();String sql = "select * from user";try {Statement st = conn.createStatement();//创建预处理对象ResultSet rs = st.executeQuery(sql);//获得结果集Element root = new Element("users");//创建根元素while (rs.next()) {Element user = new Element("user");//创建子元素root.addContent(user);//添加子元素到根节点Element id = new Element("ID");//创建叶子节点id.setText(rs.getString("ID"));//给叶子节点赋值user.addContent(id);//添加叶子节点到父节点Element ename = new Element("USERNAME");ename.setText(rs.getString("USERNAME"));//给叶子节点赋值user.addContent(ename);Element password = new Element("PASSWORD");//创建叶子节点password.setText(rs.getString("PASSWORD"));//给叶子节点赋值user.addContent(password);//添加叶子节点到父节点Element status = new Element("STATUS");status.setText(rs.getString("STA TUS"));//给叶子节点赋值user.addContent(status);Element descn = new Element("DESCN");descn.setText(rs.getString("DESCN"));//给叶子节点赋值user.addContent(descn);}Document doc = new Document();//创建文本对象doc.addContent(root);//添加树倒文本中Format format= Format.getCompactFormat();format.setIndent(" ");XMLOutputter out = new XMLOutputter(format);//创建输出流FileWriter fw = new FileWriter(file);//写数据out.output(doc, fw);//输出到xml文件中fw.close();//关闭写入流} catch (SQLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {//把数据库的数据写入xml文件中WriteXml.WriterFileToXml();}}2.连接数据库java类:DatabaseConnection.java:代码如下复制代码package .csrc.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;/*** 连接数据库** @author admin**/public class DatabaseConnection {private static final String driverName = "com.mysql.jdbc.Driver";private static final String url = "jdbc:mysql://localhost/springdb?autoReconnect=true&useUnicode=true&characterEnc oding=UTF8";private static final String username = "root";private static final String password = "root";static {try {Class.forName(driverName);} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConn() {Connection conn = null;try {conn = DriverManager.getConnection(url, username, password);} catch (SQLException e) {e.printStackTrace();}return conn;}public static void main(String[] args) {Connection conn = getConn();System.out.println(conn);}}更多信息请查看IT技术专栏。
读写XML的四种方法XML(eXtensible Markup Language)是一种用于表示和传输数据的标记语言。
它具有良好的可读性和扩展性,被广泛应用于Web开发、数据交换和配置文件等领域。
在读写和处理XML数据时,有许多方法可供选择。
本文将介绍四种常见的读写XML的方法:DOM、SAX、JDOM、和XMLStreamReader/XMLStreamWriter。
1. DOM(Document Object Model):DOM是一种基于树形结构的解析器,它将整个XML文档加载到内存中,并将其表示为一个对象树。
在DOM中,每个XML元素都被表示为一个节点(Node),可以通过节点的属性和方法对其进行操作。
读取XML文档时,可以使用DOM解析器将其转换为一个DOM树,然后通过节点的方法访问和修改树结构。
写入XML文档时,可以通过创建和修改节点来构建DOM树,并使用DOM解析器将其保存为XML文档。
使用DOM读取XML文档的基本步骤如下:- 创建一个DocumentBuilderFactory对象。
- 根据DocumentBuilderFactory对象创建一个DocumentBuilder对象。
- 使用DocumentBuilder对象解析XML文档,并返回一个Document对象。
- 通过Document对象的方法遍历和操作XML文档的节点。
使用DOM写入XML文档的基本步骤如下:- 创建一个DocumentBuilderFactory对象。
- 根据DocumentBuilderFactory对象创建一个DocumentBuilder对象。
- 使用DocumentBuilder对象创建一个Document对象。
- 通过Document对象的方法创建和添加元素节点、属性节点等。
- 使用TransformerFactory和Transformer对象将Document对象保存为XML文档。
DOM的优点是易于使用和理解,可以方便地遍历和修改XML文档。
JDOM2.0.5版本通过xpath读取xml或读取带有命名空间的xmlorg.jdom2.xpath.XPath类居然标注过时,无奈之下只能研究api。
发现Use XPathFactory/XPathExpression/XPathBuilder instead.也就是说jdom应该是将xpath类的功能进行了更加详细的分类。
根据经验进行了一些类的测试,最后得出了读取xml的两种方式。
第一种方式,通过XPathFactory类读取xmlxml文件的内容如下[html]view plaincopy1.<span style="font-size:14px"><?xml version="1.0"?>2.<?xml-stylesheet type="text/xsl" href="test.xsl"?>3.<homepages xmlns:xlink="/1999/xlink">4.5.<homepage xlink:type="simple"6.xlink:href="">Visit W3Schoo l</homepage>7.8.<homepage xlink:type="simple"9.xlink:href="">Visit W3C</homepage>10.11.</homepages></span>通过SAXBuilder获取document和root[java]view plaincopy1.String path = System.getProperty("user.dir") + "\\src\\co m\ ml\\file\\test.xml";2.3.SAXBuilder saxBuilder = new SAXBuilder();4.5.Document document = saxBuilder.build(path);6.7.Element root = document.getRootElement();建立XPathFactory类的对象,需要引入jaxen的jar包,我们使用JaxenXPathFactory类来生成XPathFactory[java]view plaincopy1.XPathFactory factory = JaxenXPathFactory.instance();生产xpath表达式实例对象,并获取结果集[java]view plaincopy1.XPathExpression<Object> objs = pile("//hom epages");2.3.List<Object> objList = objs.diagnose(root, false).getResul t();完整代码是[java]view plaincopy1.String path = System.getProperty("user.dir") + "\\src\\co m\ ml\\file\\test.xml";2.3.SAXBuilder saxBuilder = new SAXBuilder();5.Document document = saxBuilder.build(path);6.7.Element root = document.getRootElement();8.9.XPathFactory factory = JaxenXPathFactory.instance();10.11.XPathExpression<Object> objs = pile("//h omepages");12.13.List<Object> objList = objs.diagnose(root, false).getRe sult();第二种方式,通过XPathBuilder获取xpath表达式的实例对象集合首先来创建一个filter,org.jdom2.filter.Filters中提供给我们了一些过滤器,我们这里选择元素类型的,Filter接口的全名是org.jdom2.filter.Filter[java]view plaincopy1.Filter<Element> filter = Filters.element();生成XPathBuilder对象[java]view plaincopy1.XPathBuilder<Element> builder = new XPathBuilder<Ele ment>("//homepages", filter);根据它的compileWith(XPathFactory factory)方法来获取到我们需要的xpath表达式的实例对象集合[java]view plaincopy1.XPathFactory factory = JaxenXPathFactory.instance();3.XPathExpression<Element> objs = pileWith(f actory);之后的方式就和方法1一样了。