-不同软件间的数据传输 -不同系统间的数据传输 -不同平台间的数据共享
-DOM解析 -SAX解析 -DOM4J解析 -JDOM解析 -DOM解析与SAX解析不需要额外的jar,是java官方的解析方式。 -解析遇到乱码时可以修改xml中编码方式,或者对InputStream流进行InputStreamReader包装并指定编码方式。
节点类型 | NodeType | Named Constant | nodeName 的返回值 | nodeValue的返回值 |
---|---|---|---|---|
Element | 1 | ELEMENT_NODE | element name | null |
Attr | 2 | ATTRIBUTE_NODE | 属性名称 | 属性值 |
Text | 3 | TEXT_NODE | text | 节点内容 |
-将整个xml加载到内存中再解析 -所解析的XML文件(以后的解析方法中不再赘述)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.sPRingframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd"> <!-- 引入外部属性文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置c3p0连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="passWord" value="${jdbc.password}"/> </bean> <!-- 配置hibernate其他相关属性 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 注入连接池 --> <property name="dataSource" ref="dataSource"/> <!-- 配置hibernate属性 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <!-- 加载hibernate配置文件 --> <property name="mappingResources"> <list> <value>entity/Employee.hbm.xml</value> <value>entity/Department.hbm.xml</value> </list> </property> </bean> <!-- 配置Action --> <bean id="employeeAction" class="action.EmployeeAciton" scope="prototype"> <property name="employeeService" ref="employeeService"/> <property name="departmentService" ref="departmentService"/> </bean> <bean id="departmentAction" class="action.DepartmentAction" scope="prototype"> <property name="departmentService" ref="departmentService"/> </bean> <!-- 配置业务层 --> <bean id="employeeService" class="service.EmployeeServiceImpl"> <property name="employeeDAO" ref="employeeDAO"/> </bean> <bean id="departmentService" class="service.DepartmentServiceImpl"> <property name="departmentDAO" ref="departmentDAO"/> </bean> <!-- 配置DAO --> <bean id="employeeDAO" class="dao.EmployeeDAOImpl"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="departmentDAO" class="dao.DepartmentDAOImpl"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="transactionManager"/></beans>import java.io.IOException;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;
public class DOM {
public static void main(String[] args) { // 创建一个DocumentBuilderFactory对象 DocumentBuilderFactory xDocumentBuilderFactory = DocumentBuilderFactory.newInstance(); try { // 创建一个DocumentBuilder对象 DocumentBuilder xdocumentBuilder = xDocumentBuilderFactory.newDocumentBuilder(); // 传入要解析的XML文件 Document xDocument = xdocumentBuilder.parse("applicationContext.xml"); // 通过标签获得节点集合 NodeList beanList = xDocument.getElementsByTagName("bean"); System.out.println("共有" + beanList.getLength() + "个节点"); // 遍历每一个bean节点 for (int i = 0; i < beanList.getLength(); i++) { // 获取其中一个节点 Node bean = beanList.item(i); // 获取所有属性值 NamedNodeMap attrs = bean.getAttributes(); System.out.println("第" + (i + 1) + "个bean有" + attrs.getLength() + "个属性"); // 遍历节点属性 for (int j = 0; j < attrs.getLength(); j++) { // 获取某一属性 Node attr = attrs.item(j); // 获取属性名 System.out.println("属性名:" + attr.getNodeName()); // 获取属性值 System.out.println("属性值:" + attr.getNodeValue()); } // 当不需要遍历所有属性时,采用以下方法可遍历个别已知属性 Element bean2 = (Element) beanList.item(i); System.out.println("采用Element方式获得id:" + bean2.getAttribute("id")); // 解析bean节点的子节点 NodeList childBean = bean.getChildNodes(); // 遍历 childBean每个节点的节点名和节点值,空白和换行符也会算作子节点 System.out.println("第" + (i + 1) + "bean" + "共有" + childBean.getLength() + "个子节点"); for (int j = 0; j < childBean.getLength(); j++) { // 区分text类型的Node以及element类型的Node,过滤掉空白与换行符 if (childBean.item(j).getNodeType() == Node.ELEMENT_NODE) { // 获取element类型节点的节点名 System.out.println("第" + (j + 1) + "个节点的节点名:" + childBean.item(j).getNodeName()); // element会把标签中的内容视为标签的子节点,所以要想获取内容需先访问子节点 if(childBean.item(j).getFirstChild() != null){ System.out.println("第" + (j + 1) + "个节点的节点值:" + childBean.item(j).getFirstChild().getNodeValue()); } // 获取子节点的节点值以及标签之间的值 System.out.println("第" + (j + 1) + "个节点的节点值:" + childBean.item(j).getTextContent()); } } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}} -Java代码
import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class DOM { public static void main(String[] args) { // 创建一个DocumentBuilderFactory对象 DocumentBuilderFactory xDocumentBuilderFactory = DocumentBuilderFactory.newInstance(); try { // 创建一个DocumentBuilder对象 DocumentBuilder xdocumentBuilder = xDocumentBuilderFactory.newDocumentBuilder(); // 传入要解析的XML文件 Document xDocument = xdocumentBuilder.parse("applicationContext.xml"); // 通过标签获得节点集合 NodeList beanList = xDocument.getElementsByTagName("bean"); System.out.println("共有" + beanList.getLength() + "个节点"); // 遍历每一个bean节点 for (int i = 0; i < beanList.getLength(); i++) { // 获取其中一个节点 Node bean = beanList.item(i); // 获取所有属性值 NamedNodeMap attrs = bean.getAttributes(); System.out.println("第" + (i + 1) + "个bean有" + attrs.getLength() + "个属性"); // 遍历节点属性 for (int j = 0; j < attrs.getLength(); j++) { // 获取某一属性 Node attr = attrs.item(j); // 获取属性名 System.out.println("属性名:" + attr.getNodeName()); // 获取属性值 System.out.println("属性值:" + attr.getNodeValue()); } // 当不需要遍历所有属性时,采用以下方法可遍历个别已知属性 Element bean2 = (Element) beanList.item(i); System.out.println("采用Element方式获得id:" + bean2.getAttribute("id")); // 解析bean节点的子节点 NodeList childBean = bean.getChildNodes(); // 遍历 childBean每个节点的节点名和节点值,空白和换行符也会算作子节点 System.out.println("第" + (i + 1) + "bean" + "共有" + childBean.getLength() + "个子节点"); for (int j = 0; j < childBean.getLength(); j++) { // 区分text类型的Node以及element类型的Node,过滤掉空白与换行符 if (childBean.item(j).getNodeType() == Node.ELEMENT_NODE) { // 获取element类型节点的节点名 System.out.println("第" + (j + 1) + "个节点的节点名:" + childBean.item(j).getNodeName()); // element会把标签中的内容视为标签的子节点,所以要想获取内容需先访问子节点 if(childBean.item(j).getFirstChild() != null){ System.out.println("第" + (j + 1) + "个节点的节点值:" + childBean.item(j).getFirstChild().getNodeValue()); } // 获取子节点的节点值以及标签之间的值 System.out.println("第" + (j + 1) + "个节点的节点值:" + childBean.item(j).getTextContent()); } } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}共有9个节点 第1个bean有2个属性 属性名:class 属性值:com.mchange.v2.c3p0.ComboPooledDataSource 属性名:id 属性值:dataSource 采用Element方式获得id:dataSource 第1bean共有9个子节点 第2个节点的节点名:property 第2个节点的节点值: 第4个节点的节点名:property 第4个节点的节点值: 第6个节点的节点名:property 第6个节点的节点值: 第8个节点的节点名:property 第8个节点的节点值: 第2个bean有2个属性 属性名:class 属性值:org.springframework.orm.hibernate4.LocalSessionFactoryBean 属性名:id 属性值:sessionFactory 采用Element方式获得id:sessionFactory 第2bean共有13个子节点 第4个节点的节点名:property 第4个节点的节点值: 第8个节点的节点名:property 第8个节点的节点值:
第8个节点的节点值:
org.hibernate.dialect.MySQLDialect true true update第12个节点的节点名:property 第12个节点的节点值:
第12个节点的节点值:
entity/Employee.hbm.xml entity/Department.hbm.xml第3个bean有3个属性 属性名:class 属性值:action.EmployeeAciton 属性名:id 属性值:employeeAction 属性名:scope 属性值:prototype 采用Element方式获得id:employeeAction 第3bean共有5个子节点 第2个节点的节点名:property 第2个节点的节点值: 第4个节点的节点名:property 第4个节点的节点值: 第4个bean有3个属性 属性名:class 属性值:action.DepartmentAction 属性名:id 属性值:departmentAction 属性名:scope 属性值:prototype 采用Element方式获得id:departmentAction 第4bean共有3个子节点 第2个节点的节点名:property 第2个节点的节点值: 第5个bean有2个属性 属性名:class 属性值:service.EmployeeServiceImpl 属性名:id 属性值:employeeService 采用Element方式获得id:employeeService 第5bean共有3个子节点 第2个节点的节点名:property 第2个节点的节点值: 第6个bean有2个属性 属性名:class 属性值:service.DepartmentServiceImpl 属性名:id 属性值:departmentService 采用Element方式获得id:departmentService 第6bean共有3个子节点 第2个节点的节点名:property 第2个节点的节点值: 第7个bean有2个属性 属性名:class 属性值:dao.EmployeeDAOImpl 属性名:id 属性值:employeeDAO 采用Element方式获得id:employeeDAO 第7bean共有3个子节点 第2个节点的节点名:property 第2个节点的节点值: 第8个bean有2个属性 属性名:class 属性值:dao.DepartmentDAOImpl 属性名:id 属性值:departmentDAO 采用Element方式获得id:departmentDAO 第8bean共有3个子节点 第2个节点的节点名:property 第2个节点的节点值: 第9个bean有2个属性 属性名:class 属性值:org.springframework.orm.hibernate4.HibernateTransactionManager 属性名:id 属性值:transactionManager 采用Element方式获得id:transactionManager 第9bean共有3个子节点 第2个节点的节点名:property 第2个节点的节点值:
-通过自己创建的Handler处理类去逐个分析遇到的节点 -startElement解析开始节点 -endElement解析结束节点
SAX解析开始 节点名是:beans 节点名是:context:property-placeholder bean第1个属性名id 属性值:dataSource bean第2个属性名class 属性值:com.mchange.v2.c3p0.ComboPooledDataSource 节点名是:property 节点名是:property 节点名是:property 节点名是:property 第1个bean结束遍历 bean第1个属性名id 属性值:sessionFactory bean第2个属性名class 属性值:org.springframework.orm.hibernate4.LocalSessionFactoryBean 节点名是:property 节点名是:property 节点名是:props 节点名是:prop 节点值:org.hibernate.dialect.MySQLDialect 节点名是:prop 节点值:true 节点名是:prop 节点值:true 节点名是:prop 节点值:update 节点名是:property 节点名是:list 节点名是:value 节点值:entity/Employee.hbm.xml 节点名是:value 节点值:entity/Department.hbm.xml 第2个bean结束遍历 bean第1个属性名id 属性值:employeeAction bean第2个属性名class 属性值:action.EmployeeAciton bean第3个属性名scope 属性值:prototype 节点名是:property 节点名是:property 第3个bean结束遍历 bean第1个属性名id 属性值:departmentAction bean第2个属性名class 属性值:action.DepartmentAction bean第3个属性名scope 属性值:prototype 节点名是:property 第4个bean结束遍历 bean第1个属性名id 属性值:employeeService bean第2个属性名class 属性值:service.EmployeeServiceImpl 节点名是:property 第5个bean结束遍历 bean第1个属性名id 属性值:departmentService bean第2个属性名class 属性值:service.DepartmentServiceImpl 节点名是:property 第6个bean结束遍历 bean第1个属性名id 属性值:employeeDAO bean第2个属性名class 属性值:dao.EmployeeDAOImpl 节点名是:property 第7个bean结束遍历 bean第1个属性名id 属性值:departmentDAO bean第2个属性名class 属性值:dao.DepartmentDAOImpl 节点名是:property 第8个bean结束遍历 bean第1个属性名id 属性值:transactionManager bean第2个属性名class 属性值:org.springframework.orm.hibernate4.HibernateTransactionManager 节点名是:property 第9个bean结束遍历 节点名是:tx:annotation-driven SAX解析结束 bean个数:9 dataSource sessionFactory employeeAction departmentAction employeeService departmentService employeeDAO departmentDAO transactionManager
-需要jdom-2.0.6.jar
开始解析第1bean 属性名:location 属性值:classpath:jdbc.properties 集合长度:1 null 开始解析第2bean 属性名:id 属性值:dataSource 属性名:class 属性值:com.mchange.v2.c3p0.ComboPooledDataSource 节点名:property 节点值: 节点名:property 节点值: 节点名:property 节点值: 节点名:property 节点值: 集合长度:2 null dataSource 开始解析第3bean 属性名:id 属性值:sessionFactory 属性名:class 属性值:org.springframework.orm.hibernate4.LocalSessionFactoryBean 节点名:property 节点值: 节点名:property 节点值:
org.hibernate.dialect.MySQLDialect true true update节点名:property 节点值:
entity/Employee.hbm.xml entity/Department.hbm.xml集合长度:3 null dataSource sessionFactory 开始解析第4bean 属性名:id 属性值:employeeAction 属性名:class 属性值:action.EmployeeAciton 属性名:scope 属性值:prototype 节点名:property 节点值: 节点名:property 节点值: 集合长度:4 null dataSource sessionFactory employeeAction 开始解析第5bean 属性名:id 属性值:departmentAction 属性名:class 属性值:action.DepartmentAction 属性名:scope 属性值:prototype 节点名:property 节点值: 集合长度:5 null dataSource sessionFactory employeeAction departmentAction 开始解析第6bean 属性名:id 属性值:employeeService 属性名:class 属性值:service.EmployeeServiceImpl 节点名:property 节点值: 集合长度:6 null dataSource sessionFactory employeeAction departmentAction employeeService 开始解析第7bean 属性名:id 属性值:departmentService 属性名:class 属性值:service.DepartmentServiceImpl 节点名:property 节点值: 集合长度:7 null dataSource sessionFactory employeeAction departmentAction employeeService departmentService 开始解析第8bean 属性名:id 属性值:employeeDAO 属性名:class 属性值:dao.EmployeeDAOImpl 节点名:property 节点值: 集合长度:8 null dataSource sessionFactory employeeAction departmentAction employeeService departmentService employeeDAO 开始解析第9bean 属性名:id 属性值:departmentDAO 属性名:class 属性值:dao.DepartmentDAOImpl 节点名:property 节点值: 集合长度:9 null dataSource sessionFactory employeeAction departmentAction employeeService departmentService employeeDAO departmentDAO 开始解析第10bean 属性名:id 属性值:transactionManager 属性名:class 属性值:org.springframework.orm.hibernate4.HibernateTransactionManager 节点名:property 节点值: 集合长度:10 null dataSource sessionFactory employeeAction departmentAction employeeService departmentService employeeDAO departmentDAO transactionManager 开始解析第11bean 属性名:transaction-manager 属性值:transactionManager 集合长度:11 null dataSource sessionFactory employeeAction departmentAction employeeService departmentService employeeDAO departmentDAO transactionManager null
开始遍历:property-placeholder 节点名:location 节点值:classpath:jdbc.properties 开始遍历:bean 节点名:id 节点值:dataSource 节点名:class 节点值:com.mchange.v2.c3p0.ComboPooledDataSource 子节点名:property 子节点值: 子节点名:property 子节点值: 子节点名:property 子节点值: 子节点名:property 子节点值: 开始遍历:bean 节点名:id 节点值:sessionFactory 节点名:class 节点值:org.springframework.orm.hibernate4.LocalSessionFactoryBean 子节点名:property 子节点值: 子节点名:property 子节点值:
org.hibernate.dialect.MySQLDialect true true update子节点名:property 子节点值:
entity/Employee.hbm.xml entity/Department.hbm.xml开始遍历:bean 节点名:id 节点值:employeeAction 节点名:class 节点值:action.EmployeeAciton 节点名:scope 节点值:prototype 子节点名:property 子节点值: 子节点名:property 子节点值: 开始遍历:bean 节点名:id 节点值:departmentAction 节点名:class 节点值:action.DepartmentAction 节点名:scope 节点值:prototype 子节点名:property 子节点值: 开始遍历:bean 节点名:id 节点值:employeeService 节点名:class 节点值:service.EmployeeServiceImpl 子节点名:property 子节点值: 开始遍历:bean 节点名:id 节点值:departmentService 节点名:class 节点值:service.DepartmentServiceImpl 子节点名:property 子节点值: 开始遍历:bean 节点名:id 节点值:employeeDAO 节点名:class 节点值:dao.EmployeeDAOImpl 子节点名:property 子节点值: 开始遍历:bean 节点名:id 节点值:departmentDAO 节点名:class 节点值:dao.DepartmentDAOImpl 子节点名:property 子节点值: 开始遍历:bean 节点名:id 节点值:transactionManager 节点名:class 节点值:org.springframework.orm.hibernate4.HibernateTransactionManager 子节点名:property 子节点值: 开始遍历:annotation-driven 节点名:transaction-manager 节点值:transactionManager
-Java自带方法,具有平台无关性 -基于事件驱动
-将xml文件一次性加载入内存中,并形成DOM树
-形成了树结构,直观并且易于理解,代码容易编写 -解析过程保留在内存中,方便修改
-当xml文件较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出
-基于事件,一步一步解析 -每遇到一个标签则进行判断,采用handler中哪种方式进行处理
-采用事件驱动模式,对内存耗费小 -适用于只需要处理xml中的数据时
-不易编码 -很难同时访问一个xml中的多处数据
-仅使用具体类而不使用接口 -API大量使用Collections类
-JDOM的智能分支,合并了许多超出基本xml文档表示的功能 -使用接口和抽象基本类的方法,是一个优秀的api -性能优异,灵活性好,功能强大,易用 -源码开放 -建议使用
SAX>DOM>DOM4J>JDOM
新闻热点
疑难解答