1 、问题出现原因
被交接一个功能,功能的其中一个部分是生成一个xml文件,代码已经大部分完成,
运行一试,结果导出的文件里<>全都是<和>,仔细一看是手动拼成的xml字符串然后,
懒得动了。。。。
1、最初想法
将手动拼串部分改成用Document 可是看了一下算了,那样的话改动太大,给的时间不允许,
GG。
2、简单直接–>百度
貌似没有找到直接解决问题的办法,要么说用Documen要么说设置什么编码之类的,
看了一会没耐心再看下去了。
GG.
3、直接干源码
于是乎打开了Xmlwriter.class 全局搜< ,还真的被我收到了。。。。
protected String escapeElementEntities(String text) {
char[] block = null;
int last = 0;
int size = text.length();
int i;
String entity;
for(i = 0; i < size; ++i) {
entity = null;
char c = text.charAt(i);
switch(c) {
case '\t':
case '\n':
case '\r':
if (this.preserve) {
entity = String.valueOf(c);
}
break;
case '&':
entity = "&";
break;
case '<':
entity = "<";
break;
case '>':
entity = ">";
break;
default:
if (c < ' ' || this.shouldEncodeChar(c)) {
entity = "&#" + c + ";";
}
}
if (entity != null) {
if (block == null) {
block = text.toCharArray();
}
this.buffer.append(block, last, i - last);
this.buffer.append(entity);
last = i + 1;
}
}
if (last == 0) {
return text;
} else {
if (last < size) {
if (block == null) {
block = text.toCharArray();
}
this.buffer.append(block, last, i - last);
}
entity = this.buffer.toString();
this.buffer.setLength(0);
return entity;
}
}
那说明一个问题转义是它本身操作的,那说明肯定可以手动控制是否需要进行转义,那就最笨的方法顺着XxmlWriter.write(String)这个方法往下走
发现走到这个地方的时候调用了上边那个方法,此处是有个判断的this.escapeText,这个变量可以看到在所有的构造方法中给的默认值都是true;那问题就简单了只要在write之前将该值变为false就ok了
于是乎
writer.setEscapeText(false);
writer.write(str);
问题解决了
只不过没有格式化。。。。
继续撸。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
发现 new StringTokenizer(text)跳过了 " \t\n\r\f" 奶了个腿的
一切都在这个方法里
protected void writeString(String text) throws IOException {
if (text != null && text.length() > 0) {
if (this.escapeText) {
text = this.escapeElementEntities(text);
}
if (this.format.isTrimText()) {
boolean first = true;
String token;
for(StringTokenizer tokenizer = new StringTokenizer(text); tokenizer.hasMoreTokens(); this.lastChar = token.charAt(token.length() - 1)) {
token = tokenizer.nextToken();
if (first) {
first = false;
if (this.lastOutputNodeType == 3) {
this.writer.write(" ");
}
} else {
this.writer.write(" ");
}
this.writer.write(token);
this.lastOutputNodeType = 3;
}
} else {
this.lastOutputNodeType = 3;
this.writer.write(text);
this.lastChar = text.charAt(text.length() - 1);
}
}
}
里面 判断了是否需要转义,是否需要格式化,那就好办了 this.format.isTrimText()只要让他为false就ok了也就是让 字符串里的\n起作用
那就看这个只是哪里来的了
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setTrimText(false);//
try {
XMLWriter writer = new XMLWriter(outputFormat);
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
初始化的时候 OutputFormat 将该值置为false
问题解决!!!
xml还是不要使用字符串,满屏绿油油的 you know!!!
而且结构不好掌握,尤其是层次比较多的时候。
遇到问题还是看源码来的比较快比较直接,当然这个只是一个xmlWriter,如果像spring 出问题看源码可能就。。。 不过带着问题看源码终究是比较快的,和直接学习源码不一样,有目的性所有很多东西可以直接过只为解决问题的时候还是比较快的