transform方法的乱码问题

当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")));


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值