5. 格式化输出和指定编码 默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。8 m( I9 |$ M5 c2 X @ o t; C: m
/**, ~! j% T0 m: U$ Q5 | \7 }+ i1 }
* 格式化XML文档,并解决中文问题' e) C, a( d/ s! M) r* P% e _$ c
* @param filename
/ X- N# o( C) A$ J# G3 t4 R4 n * @return
3 X4 k8 l, F! P" g( E1 v" J1 P. z */
% @! p. w8 S/ N; W( R' _* z5 } public int formatXMLFile(String filename){
* a+ K, T" a' `' A! q4 ~" M$ x int returnValue = 0;# a: V) ~7 O9 ^ b
try{5 k8 [" F' b. M/ Q+ Q' f/ @* o
SAXReader saxReader = new SAXReader();! o ]+ z9 z) w1 W! v
Document document = saxReader.read(new File(filename));
- Q; N$ u# t' ]. [7 |4 P# ]1 q XMLWriter writer = null;
" r4 F- |# h0 F /** 格式化输出,类型IE浏览一样 */3 j! W9 U9 R4 W: W) l& ] {2 J2 ^
OutputFormat format = OutputFormat.createPrettyPrint();# j( d E8 b: {5 U v* H k
/** 指定XML编码 */! J+ E( Z: ~. ^& x
format.setEncoding("GBK");" |+ z& x; ^ t9 r" b2 o
writer= new XMLWriter(new FileWriter(new File(filename)),format);7 A+ t/ N( Y7 b
writer.write(document);
5 l3 |/ g3 b% x, V writer.close();7 c! k. ^6 L, P8 n% d! w+ v0 d
/** 执行成功,需返回1 */5 x# C8 c0 m/ Y. a7 g
returnValue = 1;
/ J3 y* @3 L/ A6 f- G* J }catch(Exception ex){% [7 H3 F% P, k: ?7 o8 ]* c
ex.printStackTrace();7 @2 J* L" h5 K
}
9 Y3 \4 S, v+ n6 \! v return returnValue;8 a6 a E/ ^, g# [) m* c! C* A
}
6 q# Z; T* I* H0 h 说明:
9 i/ ^% J7 M3 W6 x0 k* G6 v. ~ OutputFormat format = OutputFormat.createPrettyPrint();8 p1 ^7 b/ B% \; U& Q2 ]/ q9 Q
这句指定了格式化的方式为缩进式,则非紧凑式。2 w) x9 d: ~ e
format.setEncoding("GBK");0 ?: \# ?& H+ R0 h7 P4 f
指定编码为GBK。
( j% B, c! s' }8 M) Y' [8 _) k XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format);' ]; D0 D% V6 V/ Z G! J
这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。
( }4 c0 h9 Z, Y9 j Q/ [2 y 6. 完整的类代码5 {3 {( K; [, G6 O/ \0 F2 {- q) s* D
前面提出的方法都是零散的,下面给出完整类代码。) C* V; T, c0 \
Dom4jDemo.java; b+ W5 ~9 i1 v$ {; a# K; E
package com.holen.dom4j;+ o' e3 ?& X" y
import java.io.File;. Q$ K' x# R- R( O F+ v/ l% b! Q9 l
import java.io.FileWriter;
3 l2 c" x+ n; ^/ ?' W9 ]8 n" P import java.util.Iterator;
Z; Z/ {7 `5 T! {1 t1 K% R import java.util.List;
. F( e- e; P r import org.dom4j.Attribute;4 E- p4 i2 R$ v0 w
import org.dom4j.Document;: ]% U @7 A3 t3 O5 k; }9 r
import org.dom4j.DocumentHelper;5 w: y2 `- P+ S' l5 t5 J
import org.dom4j.Element;
5 [! G7 I/ T( P+ I3 U import org.dom4j.io.OutputFormat;
+ I* Q* p0 e+ B [1 ~9 n; _& l import org.dom4j.io.SAXReader;
' `: n$ D3 r+ e$ _, K/ ~ U import org.dom4j.io.XMLWriter;
/ ~) \% L5 T. I- z6 \; C /**. W: f2 `, j4 ]8 Z
* @author Holen Chen
2 K/ q! s4 a A8 z1 Q$ ?5 g/ f */
: u2 t# _0 ]! p9 v public class Dom4jDemo {
# ^& ~; y3 E, H5 e public Dom4jDemo() {7 H7 W4 d9 [* X# ]# i0 B0 F
}. p$ A5 s. C* m S5 ~7 X
public int createXMLFile(String filename){…}- g+ F0 ~- G7 T+ u; c8 n/ H
public int ModiXMLFile(String filename,String newfilename){…}
' @. t8 n2 m. D1 A5 M public int formatXMLFile(String filename){…}
) R, w% J3 D$ |7 H public static void main(String[] args) {
$ B" [; T) O3 S' ^) C: a- w; [) F$ t8 Q Dom4jDemo temp = new Dom4jDemo();% N* a8 }$ a e
System.out.println(temp.createXMLFile("d://holen.xml")); System.out.println(temp.ModiXMLFile("d://holen.xml","d://holen2.xml"));
6 V) d+ n, N, F$ l System.out.println(temp.formatXMLFile("d://holen2.xml"));
6 ]2 D/ L+ T0 H5 @+ L @ p }
1 E& n$ p, _4 J& n, V2 h }
/ o0 a3 f( B' m6 L 说明:$ c6 Y% e! v$ |! z$ z; N5 Q0 h
main()方法中依次调用三个方法,第一个方法用于生成holen.xml,第二个方法用于修改holen.xml,并且修改后的内容另存为holen2.xml,第三个方法将holen2.xml格式化缩进式输出,并指定编码方式为GBK。- X! l- V" o# ^/ e
一个应用Dom4j的例子6 M0 T) s# U+ k2 Y- _0 q
[ 2005-4-21 ]' @- K L# S9 [% m9 ?3 ~8 \
Created with Colorer-take5 Library. Type 'net.sf.colorer.FileType@777255'* L, X6 z I# M$ ]6 }2 ?- ?/ F
0: /*
7 Z* M# D5 \* f9 @5 Y9 d 1: * Created on 2005-4-19
: `) A6 s( r/ V* ? 2: *
- U; j0 X7 H& I: n1 r 3: * Copyright (c) 2005 Julysea: F- l1 [: f8 n# x9 G& F4 W
4: * Window - Preferences - Java - Code Style - Code Templates+ [8 \7 U' Q, L3 J. E
5: */
; y% H4 P, y; y0 x 6:
8 M. e" ~ Q1 V% [& K9 s# o/ S 7: /*应用此log4j的log4j.properties配置文件
, i7 g) A5 S3 P 8: *, v; c a9 ^# m$ B- ?* e& `+ h
9: *#######################################################################- V6 \2 d1 Z% h: c7 `1 c3 W( T
10: *# Categories and levels
, ]5 ^- M) B; p2 X; P x 11: *#######################################################################
3 Y: u [, w9 J" c0 B7 T 12: *' V% H6 t, m/ D
13: *log4j.rootCategory=DEBUG, FileApp, ConApp
5 k$ V7 T' `. v5 q# s) s U 14: *log4j.category.de.jayefem=DEBUG, FileApp, ConApp
0 y x+ J0 u' ^6 w8 j 15: *4 C( [& X) ~5 D( Y( M n' ^4 F2 {
16: *#######################################################################: @7 P+ ]1 w; o2 ^
17: *# Appenders @5 ?, z. x. S" i0 A3 E
18: *#######################################################################
( a4 h; i2 d2 k; x. V 19: *% }8 q, G+ B2 S& u/ m+ `2 o
20: *# ConApp is set to be a ConsoleAppender.$ G9 [, U; J# S! r) `% m* J
21: *log4j.appender.ConApp=org.apache.log4j.ConsoleAppender
1 B v7 \" s% z+ p 22: *log4j.appender.ConApp.Target=System.out
( `% S8 S6 l- y! C6 `" L8 V 23: *log4j.appender.ConApp.layout=org.apache.log4j.PatternLayout
( z6 Y' ]5 m. A' j 24: *log4j.appender.ConApp.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n8 d6 a' e* j! n" _ m, d* n
25: * |