XML创建转换CR在HTML实体
问题描述:
我得到了与XML创建使用标准的Java对象一个相当严重的问题,我的代码如下:XML创建转换CR在HTML实体
//Generate DOM
DOMSource source = this.generateDomDocument(params...);
//WRITE XML FILE
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
//Properties
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, STRING_FIELD_DTD);
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//Convert and write to disk
transformer.transform(source, new StreamResult(
new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")));
问题是,变压器改造回车返回在
实体,我不应该在生成的XML中。这是一个例子,我有写在几种不同的语言的翻译(这就是为什么我用UTF-8)的结果文件,它们都是一样的,当它们包含CarriageReturns于文:
<content langID="EN">
<desc> Test string
do not copy.</desc>
要清除的东西起来,这是我所期望的XML:
<content langID="EN">
<desc> Test string
do not copy.</desc>
我抬头一看这个问题对谷歌和这里也有,但似乎没有解决方案或替代方法。
答
大量的工作之后,我发现了两个解决方案,以我自己的问题,他们更变通比真正的解决方案:
解决方案1
创建扩展FilterOutputStream中的一类,并实施必要的方法写上除了那些不需要的最终流(在上面的情况下的文件)中的每个字符,即
要写入流只需添加过滤器:
StreamResult result = new StreamResult(
new OutputStreamWriter(
new XMLFilterOutputStream(
new FileOutputStream(filename)),"UTF-8"));
transformer.transform(source, result);
解决方案2
在创建DOM树刚逃出\ r字符(因此从原来的文字中删除所有的回车):
String util = //original string data
Element desc = doc.createElement("desc");
Node text = doc.createTextNode((util!=null ? stringEscape(util).trim() : ""));
desc.appendChild(text);
externalElement.appendChild(desc);
而且具有逃逸方法来完成这种方式:
private String stringEscape(String str){
StringBuffer st = new StringBuffer(str);
for(int i=0; i < st.length();i++){
String s = st.substring(i,i+1);
if("\r".equals(s)){
st.replace(i,i+1,"");
}
}
return st.toString();
}
我知道,它的可怕的,但工程。
正确的解决方案AFAIK应该访问XALAN中的HTMLEntities文件并修改该文件,从而迫使变压器省略一些实体。
+2
对于'stringEscape',它可能比'str.replaceAll(“\ r”,“”)''快得多。 – lapo
我不确定,我正确理解问题:输入数据包含CR,并且XML输出应该a)不包含它们?或者b)简单地在那里换行?或c)...? –
输入数据包含CR,XML输出应该只是有一个换行符,而不是像 然后是CRLF。我用Notepad ++检查了XML代码,这就是我发现的。 – OverLex