java读写xml文件

来源:互联网 发布:三权分立 知乎 编辑:程序博客网 时间:2024/06/06 08:52

有两种方法一种是利用jdk自带的(里面的javax.xml.parsers包和org.w3c.dom包),另一种是利用dom4j架包,相比下我觉的dom4j更好,更加明了;jdk自带的那种利用节点链的数据结构,我觉的他更加复杂化了问题,刚看可能摸不着头脑。废话不多说了,来读下下面的xml

<?xml version="1.0" encoding="UTF-8"?><setting><database><use_sql>Oracle</use_sql><dialect><MySQL>org.hibernate.dialect.MySQLDialect</MySQL><Ms_SQL_Server>org.hibernate.dialect.SQLServerDialect</Ms_SQL_Server><Oracle>org.hibernate.dialect.Oracle10gDialect</Oracle></dialect><driver>oracle.jdbc.driver.OracleDriver</driver> <url>jdbc:oracle:thin:@127.0.0.1:1521:wait</url><user>system</user><password>123456</password></database><program><paging>20</paging></program></setting>

1、先来jdk自带的那种:
(1)读文件:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dbf.newDocumentBuilder();Document xmlDoc = builder.parse("setting.xml");NodeList nodeList = xmlDoc.getElementsByTagName("database");NodeList databaseList = nodeList.item(0).getChildNodes();for(int i = 0, len = databaseList.getLength(); i < len; i++){Node childNode = databaseList.item(i);if (childNode instanceof Element) {  String childName = childNode.getNodeName();if("use_sql".equals(childName))useSql = childNode.getFirstChild().getNodeValue();else if("dialect".equals(childName)){NodeList dialectNodeList = childNode.getChildNodes();for(int j = 0, len2 = dialectNodeList.getLength(); j < len2; j++){Node dialectNode = dialectNodeList.item(j);if(dialectNode instanceof Element){String dialectName = dialectNode.getNodeName();String dialectValue = dialectNode.getFirstChild().getNodeValue();dialect.put(dialectName, dialectValue);}}}else if("driver".equals(childName))driver = childNode.getFirstChild().getNodeValue();else if("url".equals(childName))url = childNode.getFirstChild().getNodeValue();else if("user".equals(childName))user = childNode.getFirstChild().getNodeValue();else if("password".equals(childName))password = childNode.getFirstChild().getNodeValue();}}nodeList = xmlDoc.getElementsByTagName("program");databaseList = nodeList.item(0).getChildNodes();for(int i = 0, len = databaseList.getLength(); i < len; i++){Node childNode = databaseList.item(i);if (childNode instanceof Element) {  String childName = childNode.getNodeName();if("paging".equals(childName)){paging = childNode.getFirstChild().getNodeValue();break;}}}



(2)写文件
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dbf.newDocumentBuilder();Document xmlDoc = builder.parse("setting.xml");NodeList nodeList = xmlDoc.getElementsByTagName("database");NodeList databaseList = nodeList.item(0).getChildNodes();for(int i = 0, len = databaseList.getLength(); i < len; i++){Node childNode = databaseList.item(i);if (childNode instanceof Element) {  String childName = childNode.getNodeName();if("use_sql".equals(childName))childNode.getFirstChild().setNodeValue(useSql);else if("driver".equals(childName))childNode.getFirstChild().setNodeValue(getDriver(useSql));else if("url".equals(childName))childNode.getFirstChild().setNodeValue(url);else if("user".equals(childName))childNode.getFirstChild().setNodeValue(user);else if("password".equals(childName))childNode.getFirstChild().setNodeValue(password);}}nodeList = xmlDoc.getElementsByTagName("program");databaseList = nodeList.item(0).getChildNodes();for(int i = 0, len = databaseList.getLength(); i < len; i++){Node childNode = databaseList.item(i);if (childNode instanceof Element) {  String childName = childNode.getNodeName();if("paging".equals(childName)){childNode.getFirstChild().setNodeValue(paging);break;}}}//真正持久化的代码TransformerFactory factory = TransformerFactory.newInstance();Transformer t = factory.newTransformer();t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");DOMSource source =  new DOMSource(xmlDoc); StreamResult result = new StreamResult(new File("setting.xml"));t.transform(source, result);



2、利用dom4j:
(1)读文件

SAXReader reader = new SAXReader();Document xmlDoc = reader.read(new File("setting.xml"));Element root = xmlDoc.getRootElement();List<Element> properties = root.elements("database");for(Element property : properties){Element useSqlE = property.element("use_sql");useSql = useSqlE.getText();Element dialectE = property.element("dialect");for(Iterator<Element> iter = dialectE.elements().iterator(); iter.hasNext();){Element e = iter.next();dialect.put(e.getName(), e.getText());}Element driverE = property.element("driver");driver = driverE.getText();Element urlE = property.element("url");url = urlE.getText();Element userE = property.element("user");user = userE.getText();Element passwordE = property.element("password");password = passwordE.getText();}properties = root.elements("program");for(Element property : properties){Element pagingE = property.element("paging");paging = pagingE.getText();String name = property.getName();}

(2)写文件:

SAXReader reader = new RAXReader();<span style="white-space:pre"></span>Document xmlDoc = reader.read(new File("setting.xml"));Element root = xmlDoc.getRootElement();List<Element> properties = root.elements("database");for(Element property : properties){Element useSqlE = property.element("use_sql");useSqlE.setText(useSql);Element driverE = property.element("driver");driverE.setText(getDriver(useSql));Element urlE = property.element("url");urlE.setText(url);Element userE = property.element("user");userE.setText(user);Element passwordE = property.element("password");passwordE.setText(password);}properties = root.elements("program");for(Element property : properties){String name = property.getName();if("paging".equals(name))property.setText(paging);}//持久化<span style="white-space:pre">XMLWriter </span>writer = new XMLWriter(new FileWriter("setting.xml"));<span style="white-space:pre"></span>writer.write(xmlDoc);



补充:
如果标签带有属性,如下xml

<span style="color:#333333;"><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property><property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property><property name="hibernate.connection.url">(DESCRIPTION=(LOAD_BALANCE=yes)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.3)(PORT=1521)))(CONNECT_DATA=(SERVER=dedicated)(SERVICE_NAME=wait)))</property><property name="hibernate.connection.username">system</property><property name="hibernate.connection.password">Ze25506065</property><property name="hibernate.cache.use_query_cache">false</property><property name="hibernate.cache.use_second_level_cache">false</property><property name="hibernate.show_sql">true</property></session-factory></hibernate-configuration></span>

jdk读:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dbf.newDocumentBuilder();xmlDoc = builder.parse("src\\hibernate.cfg.xml");NodeList nodeList = xmlDoc.getElementsByTagName("session-factory");NodeList databaseList = nodeList.item(0).getChildNodes();for(int i = 0, len = databaseList.getLength(); i < len; i++){Node childNode = databaseList.item(i);if (childNode instanceof Element) {  String childName = ((Element)childNode).getAttribute("name");if("hibernate.dialect".equals(childName))childNode.getFirstChild().setNodeValue(dialect.get(useSql));else if("hibernate.connection.driver_class".equals(childName))childNode.getFirstChild().setNodeValue(driver);else if("hibernate.connection.url".equals(childName))childNode.getFirstChild().setNodeValue(url);else if("hibernate.connection.username".equals(childName))childNode.getFirstChild().setNodeValue(user);else if("hibernate.connection.password".equals(childName))childNode.getFirstChild().setNodeValue(password);}}

dom4j写:

SAXReader reader = new SAXReader();Document xmlDoc = reader.read(new File("src\\hibernate.cfg.xml"));List<Element> properties = root.elements("session-factory");for(Element property : properties){List<Element> list = property.elements();for(Iterator<Element> iter = list.iterator(); iter.hasNext();){Element e = iter.next();String name = e.attributeValue("name");if("hibernate.dialect".equals(name))e.setText(dialect.get(useSql));else if("hibernate.connection.driver_class".equals(name))e.setText(driver);else if("hibernate.connection.url".equals(name))e.setText(url);else if("hibernate.connection.username".equals(name))e.setText(user);else if("hibernate.connection.password".equals(name))e.setText(password);}}




读写都差不多,写就是设置标签的值在写入文件
注意:
用jdk写入xml会改变xml的头标签,至于解决方法我没探究,而dom4j就不会改写头标签

原创粉丝点击