-不同軟件間的數據傳輸 -不同系統間的數據傳輸 -不同平臺間的數據共享
-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.sWord" 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
新聞熱點
疑難解答