当XML文件的文件编码以及XML文件中所定义的编码皆为GBK时
<?xml version="1.0" encoding="GBK" standalone="no"?>
<书架>
<书 出版社="黑马">
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00元</售价>
</书>
<书 出版社="传智播客">
<书名>JavaScript网</书名>
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
</书架>
运行以下代码,XML 文件会出现乱码
public class Test {
private static String filePath = "src/books.xml";
public static void main(String[] args) throws Exception{
Document doc = null;
//1、获得文档建造器
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
//2、通过传入的XML文件构建代表整个XML文档的document对象
doc = db.parse(filePath);
//test1(doc);
//test2(doc);
test3(doc);
}
//3、修改某个元素节点的主体内容(第1本书的售价 39---69)
public static void test3(Document doc){
try{
//1、获得第一个书节点
NodeList bookList = doc.getElementsByTagName("书");
Node firstBookNode = bookList.item(0);
//2、获得书节点的子售价节点
//3、修改售价节点的内容
Node saleNode = null;
for(int i=0;i<firstBookNode.getChildNodes().getLength();i++){
saleNode=firstBookNode.getChildNodes().item(i);
if("售价".equals(saleNode.getNodeName())){
saleNode.setTextContent("69.00元");
}
}
//4、更新XML文档
//4.1得到Transformer对象
//4.2利用Transformer的transform更新文档
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc),new StreamResult("src/books.xml"));
//将上一行代码替换为下一行代码可解决乱码问题
//transformer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(new FileOutputStream("src/books.xml"),"GBK")));
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
解决方法是将:
transformer.transform(new DOMSource(doc),new StreamResult("src/books.xml"));
代码替换为:
transformer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(new FileOutputStream("src/books.xml"),"GBK")));