java生成随机数最安全的方法XML时怎样才能输出<这符号

java中用freemarker生成word文档时&字符出错,生成的word文档提示无法打开文档,内容有错误_百度知道
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
java中用freemarker生成word文档时&字符出错,生成的word文档提示无法打开文档,内容有错误
就是源数据库中有&字符,生成word后就打不开,利用wps打开后,&后的内容全部丢失
我有更好的答案
point.getMaterialScience();&&, &&&&nbsp用freemarker生成的word,在xml和html中如果包含下面这些特殊字符;#61548;&amp。刚开始玩&知道&,希望楼主问题解决了可以采纳,就按后面的提示在Java代码中用replace()方法替换掉:&替换为&&符号:map,不太会弄&&&替换为&));就可以了。我是看了你的问题自己研究了小一个小时解决的;#61548;&&amp.replace(&MaterialScience&;&&&如:替换&&替换为'#61548;&& &替换为&替换为&gt.put(&quot
采纳率:76%
这个字符可以屏蔽掉
不能屏蔽,因为要转化为c语言试题,&字符必不可少
你可以用这个‘﹠’字符试一下
如解决,请采纳
wps可以了,但word不行
为您推荐:
其他类似问题
freemarker的相关知识
换一换
回答问题,赢新手礼包温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
除了自己一无所有的北漂!!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
双引号实体必须以符号"&"开头,以符号";"结尾。&注意: 只有"&" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。
CDATA部件:在CDATA内部的所有内容都会被解析器忽略。如果文本包含了很多的"&"字符和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。一个 CDATA 部件以"&![CDATA[" 标记开始,以"]]&"标记结束;
CDATA注意事项:CDATA部件之间不能再包含CDATA部件(不能嵌套)。如果CDATA部件包含了字符"]]&" 或者"&![CDATA[" ,将很有可能出错哦。同样要注意在字符串"]]&"之间没有空格或者换行符。
2,Dom4j格式化转义字符问题:
service.xml&?xml&version="1.0"&encoding="UTF-8"?&&&&&result&&&&&service&&&&&&&service_name&extractService&/service_name&&&&&&&service_permission&&![CDATA[&auths&&&auth&&&data&re_org&/data&&&oper&read&/oper&&&/auth&&&/auths&]]&&/service_permission&&&&&&/service&&&&&&/result&&&
上面的XML在被Dom4j格式化的时候,自动会被转义,转义后的内容如下:
&?xml&version="1.0"&encoding="UTF-8"?&&&&&result&&&&&service&&&&&&&service_name&extractSrevice&/service_name&&&&&&&service_permission&&![CDATA[&auths&&&auth&&&data&re_org&/data&&&oper&read&/oper&&&/auth&&&/auths&]]&&/service_permission&&&&&&/service&&&&&&/result&&&
这样,显然不是想要的结果,因为CDATA不需要再转义了。所以在Dom4j中,我们可以这样处理:
/**& * 格式化 xml&& * @param 要格式化的xml&& * @throws Exception& * @return 格式化后的Xml& */&public&String&formatXML_cdata(String&inputXML)&throws&Exception&{&&&&&&&&&&SAXReader&reader&=&new&SAXReader();&&&&&&&&&&Document&document&=&reader.read(new&StringReader(inputXML));&&&&&&&&&&String&requestXML&=&&&&&&&&&&&XMLWriter&xw&=&&&&&&&&&&&if&(document&!=&null)&{&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&OutputFormat&format&=&OutputFormat.createPrettyPrint();&&&&&&&&&&&&&&&&&format.setEncoding("UTF-8");&&&&&&&&&&&&&&&&&StringWriter&sw&=&new&StringWriter();&&&&&&&&&&&&&&&&&xw&=&new&XMLWriter(sw,&format);&&&&&&&&&&&&&&&&&xw.setEscapeText(false);&&&&&&&&&&&&&&&&xw.write(document);&&&&&&&&&&&&&&&&requestXML&=&sw.toString();&&&&&&&&&&&&&&&&xw.flush();&&&&&&&&&&&&&}&finally&{&&&&&&&&&&&&&&if&(xw&!=&null)&{&&&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&xw.close();&&&&&&&&&&&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&&&&&return&requestXML;&&&&&&}&&
其它同我上篇博文所写相同,在这里特别需要注意的是:
createPrettyPrint():是一个静态辅助方法,可以用来创建漂亮的默认打印格式。此格式会缩进2个空格,修剪每个元素后的空格和其它所有的空白 。
setEscapeText(false):在该功能中,这个函数是很重要的。它决定文本输出是否应该被转义。这是默认启用的,它可以禁用。如果是文本输出格式,如在XSLT中,我们可以有XML,HTML或文本输出。
以下就是我们想要的输出:
&?xml&version="1.0"&encoding="UTF-8"?&&&&&&result&&&&&&head&&&&&&&&stat&0&/stat&&&&&&&&message&success&/message&&&&&&&&npage&0&/npage&&&&&&/head&&&&&&body&&&&&&&&services&&&&&&&&&&service&&&&&&&&&&&&service_name&addPerson&/service_name&&&&&&&&&&&&desc&人员增加&/desc&&&&&&&&&&&&wsdl&http://192.168.3.162:8080/resource_0010/services/resource?wsdl&/wsdl&&&&&&&&&&&&service_permissions&&auths&&&auth&&&data&re_org&/data&&&oper&read&/oper&&&/auth&&&auth&&&data&re_org&/data&&&oper&write&/oper&&&/auth&&&auth&&&data&re_org&/data&&&oper&read/write&/oper&&&/auth&&&/auths&&/service_permissions&&&&&&&&&&/service&&&&&&&&&&service&&&&&&&&&&&&service_name&deletPersom&/service_name&&&&&&&&&&&&desc&人员裁减&/desc&&&&&&&&&&&&wsdl&http://192.168.3.162:8080/resource_0011/services/resource?wsdl&/wsdl&&&&&&&&&&&&service_permissions&&auths&&&auth&&&data&re_org&/data&&&oper&read&/oper&&&/auth&&&auth&&&data&re_org&/data&&&oper&write&/oper&&&/auth&&&auth&&&data&re_org&/data&&&oper&read/write&/oper&&&/auth&&&/auths&&/service_permissions&&&&&&&&&&/service&&&&&&&&/services&&&&&&/body&&&&/result&&& 原文:
阅读(12236)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'java 在生成XML中输出大于号、小于号',
blogAbstract:'\r\n1,XML CDATA部件:\r\n\r\n在XML文档中的所有文本都会被解析器解析。只有在CDATA部件之内的文本会被解析器忽略。不合法的XML字符必须被替换为相应的实体。如果在XML文档中使用类似\"&\" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。\r\n',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:8,
publishTime:9,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'除了自己一无所有的北漂!!',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}posts - 18,&
comments - 2,&
trackbacks - 0
xml方式导出word优缺点:
&&&&&&&& 1、代码量少,样式、内容容易控制,打印不变形,符合office标准;
&&&&&&&& 2、支持Linux平台,不要求安装office;
&&&&&&&& 3、可以实现固定格式文档输出;
&&&&&&&& 4、支持添加图片;
&&&&&&&& 1、需要提前设计好word模板,把需要替换的地方用特殊标记标出来;
&&&&&&&& 2、若要在word中添加图片,需要在设计模板时加入一张图片进行占位,然后手动编辑xml模板文档;
1、XmlWord类的使用
XmlWord类源码:XmlWord.txt
示例代码所用模板:2.xml
【注】:创建模板的office需2003及以上版本。
使用步骤:
1、创建一个需要导出word模板;
2、创建一个XmlWord对象;
3、若模板标记有多个,存储至list中;存储替换值;
4、生成word文档;
[示例代码]:
&&&&&& XmlWord test = new XmlWord();
&&&&&& //1、载入模板
&&&&&& Document doc = test.LoadXml("2.xml");
&&&&&& //2、设置标记,tagList中存放的标记要同模板中的标记一致;
&&&&&& List&String& tagList = new ArrayList&String&();
&&&&&& tagList.add("${test_name}");
&&&&&& tagList.add("${test_no}");
&&&&&& //3、设置填充标记的值,dataList中存放数据顺序与tagList存放标记顺序一致;
&&&&&& List&String& dataList = new ArrayList&String&();
&&&&&& dataList.add("----用例名");
&&&&&& dataList.add("----用例编号");
&&&&&& //4、将标记和标记值存入dataMap
&&&&&& test.setData(tagList, dataList);
&&&&&& //5、替换值
&&&&&& /*添加图片*/
&&&&&& test.replacePic(doc.getDocumentElement(), "${img}", "8.jpg", imgStr);
&&&&&& test.replaceTagContext(doc.getDocumentElement());
&&&&&& //6、写入文档
&&&&&& test.doc2DocFile(doc, "xmlword.doc");
2、特殊说明
1、word模板制作:
&&&&&&&& 使用office 2003及以上版本写一个需要导出的word模板,然后编辑文档的样式,将需要动态填充的内容,使用特殊标记替换,如实例代码中的标记(${test_name}),最后将编辑后的word文档另存为为&Word 2003 XML 文档(*.xml)&格式,将模板放置在工程下。
2、添加图片:
&&&&&&&& 如果需要在word中添加图片,在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码:
&w:binData&w:name="wordml://03001.png"&xml:space="preserve"&iVBO&&CC&/w:binData&
只要将base64的代码替换成例如:${image},如下:
&w:binData&w:name="wordml://03001.png"&xml:space="preserve"&${image}&/w:binData&
&&&&&&&& 这里要注意&&${image}&&这尖括号中间不能加任何其他的诸如空格,tab,换行等符号,否则导出的word将会出错。
3、XmlWord类说明
Properties:
Map&String,String& dataMap
用于当模板中有多个标记时存放标记值及替换数据。
LoadXml(String filename):Document
载入一个xml文档
filename:模板路径
成功返回Document对象;
失败返回null
getImageStr(String imgFile):String
ImgFile:图片全路径名
返回图片base64字符串
doc2DocFile(Document document,String & filename):boolean
将Document对象保存为一个Doc文件
filename:保存的文件名
document:需要保存的Document对象
true:保存成功
false:保存失败
replaceTagContext(Element element,String tag,String data):Element
替换标识内容:单个标记(仅用于替换文本)
element:要填充内容的节点
tag:模板中标记
data:数据
返回替换后的节点
replaceTagContext(Element element):Element
替换标识内容:多个标记,调用此方法前,先调用setData方法(仅用于替换文本)
element:要替换内容的节点
返回替换后的节点
replacePic(Object element,String & tag,String imgName,String imgStr):Element
添加图片,此方法仅适用于单张图片的添加,多图添加可参考该方法源码
element:要替换内容的节点
tag:模板中图片标记
imgName:图片名称,若word中有多张图,图片名必须唯一
imgStr:图片转码后的base64字符串
返回替换后的节点
本类目前仅能支持文本、图片分次替换,未实现文本同图片的同时替换。
导出后效果:
XmlWord类代码:
package com.hxh.
import java.io.F
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.IOE
import java.io.InputS
import java.util.ArrayL
import java.util.D
import java.util.HashM
import java.util.I
import java.util.L
import java.util.M
import java.util.S
import javax.xml.parsers.DocumentB
import javax.xml.parsers.DocumentBuilderF
import javax.xml.transform.T
import javax.xml.transform.TransformerF
import javax.xml.transform.dom.DOMS
import javax.xml.transform.stream.StreamR
import org.w3c.dom.D
import org.w3c.dom.E
import org.w3c.dom.NodeL
import sun.misc.BASE64E
public class XmlWord {
private Map&String,String& dataMap = new HashMap&String,String&();
public Map&String, String& getDataMap() {
return dataM
public void setDataMap(Map&String, String& dataMap) {
this.dataMap = dataM
* 设置标识值
* @param tagList 标识
* @param dataList 数据
* @param dataMap
public void setData(List&String& tagList,List&String& dataList){
Iterator&String& it1 = tagList.iterator();
Iterator&String& it2 = dataList.iterator();
while(it1.hasNext()){
this.dataMap.put(it1.next(), it2.next());
* 载入一个xml文档
* @param filename 文件路径
* @return 成功返回Document对象,失败返回null
public Document LoadXml(String filename){
Document doc = null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = (Document) builder.parse(new File(filename));
} catch (Exception e) {
System.out.println("载入xml文件时出错");
e.printStackTrace();
* 图片转码
* @return 返回图片base64字符串
* @throws Exception
public String getImageStr(String imgFile){
InputStream in = null;
BASE64Encoder encoder = null;
byte[] data = null;
in = new FileInputStream(imgFile);
} catch (FileNotFoundException e) {
System.out.println("文件没找到!");
e.printStackTrace();
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
encoder = new BASE64Encoder();
return encoder.encode(data);
* doc2XmlFile
* 将Document对象保存为一个xml文件
* @return true:保存成功
flase:失败
* @param filename 保存的文件名
* @param document 需要保存的document对象
public boolean doc2XmlFile(Document document,String filename)
boolean flag = true;
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
DOMSource source=new DOMSource();
source.setNode(document);
StreamResult result=new StreamResult();
FileOutputStream fileOutputStream = new FileOutputStream(filename);
result.setOutputStream(fileOutputStream);
transformer.transform(source, result);
fileOutputStream.close();
}catch(Exception ex){
flag = false;
ex.printStackTrace();
* 替换标识内容:单个文本标记
* @param element 要替换内容的节点
* @param tag 标识名称
* @param data 替换参数
* @return 返回替换后的节点
* @throws Exception
public Element replaceTagContext(Object
element,String tag,String data){
Element xElement = null;
xElement = (Element)
NodeList tElements = xElement.getElementsByTagName("w:t");//w:t标签组
for(int i=0; i&tElements.getLength(); i++){
Element tElement = (Element)tElements.item(i);
if(tElement.getTextContent().equals(tag)){
tElement.setTextContent(data);
* 替换标识内容:多个文本标记
* @param element 要替换内容的节点
* @return 返回替换后的节点
* @throws Exception
public Element replaceTagContext(Element
Element xElement =
NodeList tElements = xElement.getElementsByTagName("w:t");//w:t标签组
Set&String& dataSet = this.dataMap.keySet();
Iterator&String& it = dataSet.iterator();
while(it.hasNext()){
String tag = it.next();
String data = dataMap.get(tag);
for(int i=0; i&tElements.getLength(); i++){
Element tElement = (Element)tElements.item(i);
if(tElement.getTextContent().equals(tag)){
tElement.setTextContent(data);
* 添加图片
* @param element 需要替换内容的节点
* @param tag 标识名称
* @param imgName 图片名称,若word中有多张图,图片名必须唯一
* @param imgStr 图片转码后的base64字符串
* @return 返回替换后的节点
public Element replacePic(Element element,String tag,String imgName,String imgFile){
Element xElement =
NodeList tElements = xElement.getElementsByTagName("w:binData");//w:t标签组
pkg:binaryData
String wName = "wordml://"+imgN
for(int i=0; i&tElements.getLength(); i++){
Element picElement = (Element)tElements.item(i);
if(picElement.getTextContent().equals(tag)){
picElement.setTextContent(this.getImageStr(imgFile));/*图片编码*/
picElement.setAttribute("w:name",wName);//设置名字
Element imagedataElement = (Element) xElement.getElementsByTagName("v:imagedata").item(i);
imagedataElement.setAttribute("src",wName);
* 插入图片
* @param parentElement 图片添加至何处
* @param imgFile 图片路径
* @param isnewLine 是否换行
* @return 返回添加图片节点后的节点
public Element addPic(Element parentElement,String imgFile,boolean isnewLine){
Document parent = parentElement.getOwnerDocument();
Element p = null;
Element pict = null;
Element binData = null;
Element shape = null;
Element imagedata = null;
String src = "wordml://" + new Date().getTime();
if(isnewLine){
p = parent.createElement("w:p");
pict = parent.createElement("w:pict");
binData = parent.createElement("w:binData");
binData.setAttribute("w:name", src);
binData.setAttribute("xml:space", "preserve");
binData.setTextContent(this.getImageStr(imgFile));
shape = parent.createElement("v:shape");
imagedata = parent.createElement("v:imagedata");
imagedata.setAttribute("src", src);
//构造图片节点
shape.appendChild(imagedata);
pict.appendChild(binData);
pict.appendChild(shape);
if(isnewLine){
p.appendChild(pict);
parentElement.appendChild(p);
parentElement.appendChild(pict);
return parentE
* 插入段落
* @param parentElement 待添加段落的节点
* @param data 待插入数据
public Element addParagraph(Element parentElement,String data){
Document parent = parentElement.getOwnerDocument();
Element p = null;
Element r = null;
Element t = null;
p = parent.createElement("w:p");
r = parent.createElement("w:r");
t = parent.createElement("w:t");
t.setTextContent(data);
//构造图片节点
r.appendChild(t);
p.appendChild(r);
parentElement.appendChild(p);
return parentE
阅读(...) 评论()JAVA XML入门及处理实例_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
JAVA XML入门及处理实例
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩43页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢2被浏览388分享邀请回答1添加评论分享收藏感谢收起

我要回帖

更多关于 java生成随机数最安全的方法 的文章

 

随机推荐