java解析xml
Posted xinzhiSoft
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java解析xml相关的知识,希望对你有一定的参考价值。
目前接触到的关于xml的主要有方面:
1、xml作为项目的配置文件,项目初始化时读取里边的内容。从系统方面考虑,在项目不重启的情况下要有修改重新载入配置的功能,此时需要对xml内容进行操作,
如果是一个大系统需要各个系统之间进行通信,通知各个服务器进行重新载入。
2、通信时传递的报文为xml格式,常见于webservice,此时接收或者传递报文时需要和bean相互转换。
第一种情况,最流行的是dom4j,使用方便,代码简练,不用再封装工具类,性能最好。
第二种情况,可以使用jaxb解析,封装一个工具类就可以实现xml与bean的相互转化。
这里写一下dom4j的使用,jaxb使用方法请点击 jaxb实现xml与bean的相互转化 。
① test.xml
<?xml version="1.0" encoding="UTF-8"?> <orgs size="7095" batch_number="20130704110039" errmsg="错误信息"> <org> <org_id>16817</org_id> <parent_id>9233</parent_id> <org_name>512AAS.苏州沧浪区</org_name> <org_code>512AAS</org_code> <org_type>门店部门1</org_type> <start_d>2011-12-28</start_d> <end_d>2011-12-29</end_d> <attribute1></attribute1> <insert_t>2013-7-4 10:32:09</insert_t> </org> <org> <org_id>16818</org_id> <parent_id>9234</parent_id> <org_name>513AAS.苏州沧浪区</org_name> <org_code>513AAS</org_code> <org_type>门店部门2</org_type> <start_d>2011-12-18</start_d> <end_d>2011-12-19</end_d> <attribute1></attribute1> <insert_t>2013-7-5 10:32:09</insert_t> </org> <org> <org_id>16819</org_id> <parent_id>9235</parent_id> <org_name>514AAS.苏州沧浪区</org_name> <org_code>514AAS</org_code> <org_type>门店部门3</org_type> <start_d>2011-12-08</start_d> <end_d>2011-12-09</end_d> <attribute1></attribute1> <insert_t>2013-7-6 10:32:09</insert_t> </org> </orgs>
/** * dom4j的代码已经很简单易懂了,不需要自己再封装工具类了 * DOM4J是 dom4j.org 出品的一个开源 XML 解析包。 * DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。 * @author cxz */ public class dom4j { public static void main(String[] args) { try { //手动创建 Document document = DocumentHelper.createDocument();//创建doc对象 Element roott = document.addElement("csdn");//创建csdn根节点 //读取xml文件为doc对象 String path = "D:\\\\test.xml"; File file = new File(path); SAXReader reader = new SAXReader(); Document doc = reader.read(file); //将整个xml转换为string String testxml = doc.asXML(); //将String转换为doc对象 doc = DocumentHelper.parseText(testxml); //读取根节点 Element root = doc.getRootElement(); //读取此节点下的子节点 Element org=root.element("org"); Element orgId = org.element("org_id"); //没有子节点的节点才能读取到text String s = orgId.getText(); System.out.println(s); //读取某节点下所有的名字为**的子节点,遍历 List<Element> nodes = root.elements("org"); for(Element e : nodes){ Element orgid = e.element("org_id"); System.out.println(orgid.getText()); } //读取某节点下的所有子节点 List<Element> es = root.elements();//得到5个orgs //在某节点下添加子节点 Element elm = root.addElement("朝代"); //设置节点文字 elm.setText("明朝"); //删除某节点 //childElement是待删除的节点,parentElement是其父节点 root.remove(org); //添加一个CDATA节点 Element contentElm = root.addElement("content"); contentElm.addCDATA("cdata区域"); //获取节点属性 Attribute attribute=root.attribute("batch_number"); String batch_number = attribute.getText(); //删除某属性 Attribute attribute1=root.attribute("errmsg"); root.remove(attribute1); //遍历节点属性值 for(Iterator it=root.attributeIterator();it.hasNext();){ Attribute attribute2 = (Attribute) it.next(); String text=attribute2.getText(); System.out.println(text); } //写入xml //无中文 XMLWriter writer = new XMLWriter(new FileWriter("ot.xml")); writer.write(document); writer.close(); //有中文 // 紧凑的格式 // OutputFormat format = OutputFormat.createCompactFormat(); // 缩紧格式 OutputFormat format = OutputFormat.createPrettyPrint();// 创建文件输出的时候,自动缩进的格式 format.setEncoding("UTF-8");//设置编码 // XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format); XMLWriter xmlwriter = new XMLWriter(new OutputStreamWriter( new FileOutputStream(new File("src//a.xml")), "UTF-8"), format); xmlwriter.write(document); xmlwriter.flush(); xmlwriter.close(); } catch (Exception e) { e.printStackTrace(); } } }
项目中的实际运用,项目启动类中的初始化xml
这里有一个获取jar包路径的工具类,如下:
/** * 路径通用类 * @author 李冬 * 说明: */ public class JarUtil { private String jarName; private String jarPath; public JarUtil(Class<?> clazz) { //获这个文件到他的bin路径 String path = clazz.getProtectionDomain().getCodeSource().getLocation().getFile(); try { path = java.net.URLDecoder.decode(path, "UTF-8"); } catch (java.io.UnsupportedEncodingException e) { e.printStackTrace(); } java.io.File jarFile = new java.io.File(path); this.jarName = jarFile.getName(); java.io.File parent = jarFile.getParentFile(); if (parent != null) { this.jarPath = parent.getAbsolutePath(); } } /** * 获取Class类所在Jar包的名称 * * @return Jar包名 (例如:C:\\temp\\demo.jar 则返回 demo.jar ) */ public String getJarName() { try { return java.net.URLDecoder.decode(this.jarName, "UTF-8"); } catch (java.io.UnsupportedEncodingException e) { e.printStackTrace(); } return null; } /** * 取得Class类所在的Jar包路径 * * @return 返回一个路径 (例如:C:\\temp\\demo.jar 则返回 C:\\temp ) */ public String getJarPath() { try { return java.net.URLDecoder.decode(this.jarPath, "UTF-8"); } catch (java.io.UnsupportedEncodingException e) { e.printStackTrace(); } return null; } public static void main(String[] args) throws Exception { JarUtil ju = new JarUtil(JarUtil.class); System.out.println("Jar name: " + ju.getJarName()); System.out.println("Jar path: " + ju.getJarPath()); } }
public void initConf() throws Exception { logger.info(">>>配置系统信息...开始读取配置文件setting.xml"); JarUtil pathUtil = new JarUtil(this.getClass()); String path = pathUtil.getJarPath(); File url = new File(path + File.separator + "setting.xml"); Element root = null; Document doc = null; SAXReader xmlReader = new SAXReader(); try { doc = xmlReader.read(url); } catch (Exception ex) { logger.info("setting.xml" + "不是合法的配置文件", ex); throw ex; } logger.info(">>>配置系统信息...读取配置文件setting.xml完毕....开始分析配置文件信息"); root = doc.getRootElement(); ...... }
来波链接
Java解析xml的四种经典方法 详解Java解析XML的四种方法—DOM/SAX/jdom/dom4j XML解析——Java中XML的四种解析方式
以上是关于java解析xml的主要内容,如果未能解决你的问题,请参考以下文章
从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration