java 修改了 XML 文件 如何保存文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 修改了 XML 文件 如何保存文件相关的知识,希望对你有一定的参考价值。

public class XmlFile
String path="src/filesystem/NewFile.xml";
public void addone(String name,String password)

DocumentBuilderFactory dvf=DocumentBuilderFactory.newInstance();
try
DocumentBuilder db=dvf.newDocumentBuilder();
Document doc= (Document) db.parse(new File(path));
Element naElement=doc.createElement("NAME");
naElement.setTextContent(name);
naElement.setAttribute("PASSOWRD",password);
Element ROOT=doc.getDocumentElement();
ROOT.appendChild(naElement);

catch (ParserConfigurationException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (SAXException e)
// TODO Auto-generated catch block
e.printStackTrace();



改好了Document le ,怎么输出到XML文件中呢?不用DOM4J 不用jDom的方法
我知道用DOM4J简单很多,有一个XMLWriter
要在在ROOT.appendChild(naElement);
后加入一段代码后可以解决问题

在修改document后,可以使用jdk提供的Transformer讲dom树转换成xml。
Source xmlSource = new DOMSource(document);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
Result result = new StreamResult(new File("..."));
transformer.transform(xmlSource, result); // 保存dom至目的文件

希望能帮上你。追问

我用过来时解决问题了,但是那个思路是什么,能不能注释清楚一点;

追答

// 由DOM充当源树, 源树包含了源(如xml源)输入信息
Source xmlSource = new DOMSource(document);
// 使用工厂模式,实例化Transformer
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
// 实例化结果树,结果树指转换后(对于stremResult包含了结果的输出流)结果的持有者
Result result = new StreamResult(new File("..."));
// Transformer能够将源树转换成结果树
transformer.transform(xmlSource, result);

原理:
简而言之,遍历dom树的每个节点,将节点序列化成流,再将输出流写入到文件之中。

讲的有些难理解,可以参照Jdk源码去跟踪整个转换过程,或者自己按照原理写一个工具,这样可加深印象。

参考技术A 这是我使用JDOM的例子,修改XML配置文件并保存。

XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<CONFIGUREDATA>
<CONFIGURE TYPE="SQL Server 2005">
<DRIVER>com.microsoft.sqlserver.jdbc.SQLServerDriver</DRIVER>
<URL>jdbc:sqlserver://localhost:1433;DatabaseName=DBName</URL>
<USERID>sa</USERID>
<PASSWORD>123</PASSWORD>
</CONFIGURE>
</CONFIGUREDATA>

Java程序:
import java.io.File;
import java.io.FileOutputStream;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class Test
public static void main(String[] args)
try
String filepath = "E:\\data\\dbconfigure.xml";

File file = new File(filepath);
SAXBuilder builder = new SAXBuilder();
Document document = (Document) builder.build(file);
Element root = document.getRootElement();
Element elem1 = root.getChild("CONFIGURE");

//修改密码
elem1.getChild("PASSWORD").setText("123456");

//写回XML文件
Format format=Format.getRawFormat();
format.setEncoding("UTF-8");
XMLOutputter output=new XMLOutputter(format);
output.output(document, new FileOutputStream(filepath));

catch(Exception e)
e.printStackTrace();




使用了jdom.jar包,网上有下载,也可以找我。
参考技术B 修改文件不需要保存的,只要关闭流就可以了! 参考技术C 不用

java解析XML修改特定项的值然后保存xml文件,求高手帮忙 急需 在线等

例如以下hibernate.cfg.xml文件,我要更改hibernate.connection.url,hibernate.connection.username,hibernate.connection.password的值:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="hibernate.connection.url">jdbc:sqlserver://192.168.1.52:1433;databaseName=Management</property>
<property name="hibernate.connection.username">parkdb</property>
<property name="hibernate.connection.password">123456789</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.max_size">50</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">50000</property>
<property name="hibernate.c3p0.max_statements">270</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">false</property>
<property name="hiberante.cache.use_second_level_cache">false</property>
<property name="hibernate.jdbc.batch_size">50</property>
<property name="hibernate.jdbc.fetch_size">100</property>
<mapping resource="model/InoutPut.hbm.xml"/>
<mapping resource="model/Uid.hbm.xml"/>
<mapping resource="model/Permission.hbm.xml"/>
<mapping resource="model/Staff.hbm.xml"/>
<mapping resource="model/Card.hbm.xml"/>
<mapping resource="model/Dept.hbm.xml"/>
<mapping resource="model/Userright.hbm.xml"/>
<mapping resource="model/Kqms.hbm.xml"/>
<mapping resource="model/SxTime.hbm.xml"/>
<mapping resource="model/Leave.hbm.xml"/>
</session-factory>
</hibernate-configuration>
急需 求给代码谢谢

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public static void main(String[] args) throws Exception
SAXReader sax = new SAXReader();
//假设你的xml是放在D盘下的叫做a.xml的文件
File file = new File("D:\\a.xml");
Document doc = sax.read(new FileInputStream(file));
Element root = doc.getRootElement();
root = root.element("session-factory");
List<Element> els = root.elements();
for(Element e : els)
if(e.getName().equals("property"))
String attval = e.attribute("name").getText();
if(attval.equals("hibernate.connection.url"))
//要修改的url的新值
e.setText("newUrl");
else if(attval.equals("hibernate.connection.username"))
/ /要修改的username的新值
e.setText("newUsername");
else if(attval.equals("hibernate.connection.password"))
//要修改的password的新值
e.setText("newPassword");



//重新写入到文件
XMLWriter output = new XMLWriter(new FileWriter(file));
output.write(doc);
output.close();


纯手打的,应该还有更简单的方法,但是没有工具忘记函数了,给你写了一个我记得住的方式,这个应该是可以的,用的是dom4j,如果你没有可能需要导入一个dom4j.jar的jar包
参考技术A 可以直接在HibernateSessionFactory中设置
configuration.configure(configFile);
configuration.setProperty("hibernate.connection.url",“你的url”);
configuration.setProperty("hibernate.connection.username",“”);
configuration.setProperty("hibernate.connection.password",“”);
sessionFactory = configuration.buildSessionFactory();
参考技术B 为什么不手动修改,必须要写程序吗?追问

上面要求jdbc:sqlserver://192.168.1.52:1433;databaseName=Management
parkdb
123456789
可以修改url的IP地址和数据库 ,username,password。我想了办法他们说不行让我用xml,而我不太懂xml所以只能求助了 如果你有好的介意还请指教

追答

我很奇怪,“他们说不行让我用xml”这就话是什么意思,既然数据库的URL可以修改了,为什么用户名和密码不能直接在XML修改,使用XML配置hibernate的数据源就是为了解决硬编码问题,XML既然在你手里,就可以有你来修改了,要用程序的话就使用DOM4j这个开源库了,他的API很简单的,我觉得这样是不是有点费力不讨好啊

追问

我写的是javaswing项目 里面有一个配置面板 要求是配置好后以后都用其上面的配置 就算是关闭了该项目 数据连接那些都不能发生改变 除非用户在配置面板中去重新配置

追答

你早说啊,我去,我还你为你写的是JavaWeb项目,等等我帮你写一个

追问

好的 谢谢了

追答

public class XMLUtil

//先读取指定的XML文件,url是文件的路径
public Document read(String url)
SAXReader reader = new SAXReader();
Document document=null;
try
document = reader.read(url);
catch (DocumentException e)
e.printStackTrace();

return document;

//设置你要改变的XML节点值url就是hibernate.connection.url的值,其他的不解释了,你知道的
public Document change(String url,String username,String password,Document document)
Element root = document.getRootElement();
Element element2 = root.element("session-factory");
for ( Iterator i = element2.elementIterator("property"); i.hasNext(); )
Element element = (Element) i.next();
Attribute attribute = element.attribute("name");
String attrValue = attribute.getValue();
if(attrValue.equals("hibernate.connection.url"))
element.setText(url);

else if(attrValue.equals("hibernate.connection.username"))
element.setText(username);

else if(attrValue.equals("hibernate.connection.password"))
element.setText(password);


return document;

//输出xml,url输出路径
public void write(String url,Document document)
OutputFormat format = OutputFormat.createPrettyPrint();
try
FileWriter fileWriter = new FileWriter(url);
XMLWriter writer = new XMLWriter(fileWriter,format);
writer.write(document);
writer.close();
catch (IOException e)
e.printStackTrace();


public static void main(String[] args)
XMLUtil xmlUtil=new XMLUtil();
Document document = xmlUtil.read("hibernate.cfg.xml");
document=xmlUtil.change("www", "datouxiangzi", "123456", document);
xmlUtil.write("hibernate.cfg.xml", document);

追问

我用了 可是报错耶
org.dom4j.DocumentException: Connection timed out: connect Nested exception: Connection timed out: connect
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.dom4j.io.SAXReader.read(SAXReader.java:321)
at XMLUtil.read(XMLUtil.java:30)
at XMLUtil.main(XMLUtil.java:70)
Nested exception:

参考技术C 使用dom4j或者是j4dom对血没了进行操作,具体可以看着两者的文档追问

我对xml不熟 可以麻烦给代码 我现在急需 谢谢

以上是关于java 修改了 XML 文件 如何保存文件的主要内容,如果未能解决你的问题,请参考以下文章

如何把java文本框内容保存到文本文件里

批量修改并保存xml文件

如何把java文本框内容保存到文本文件里

java解析XML修改特定项的值然后保存xml文件,求高手帮忙 急需 在线等

Java 小程序不保存/加载内部 xml 文件

XML 保存在文件系统上不起作用