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&#13; 
do not copy.</desc> 

要清除的东西起来,这是我所期望的XML:

<content langID="EN"> 
        <desc> Test string 
do not copy.</desc> 

我抬头一看这个问题对谷歌和这里也有,但似乎没有解决方案或替代方法。

+0

我不确定,我正确理解问题:输入数据包含CR,并且XML输出应该a)不包含它们?或者b)简单地在那里换行?或c)...? –

+0

输入数据包含CR,XML输出应该只是有一个换行符,而不是像 然后是CRLF。我用Notepad ++检查了XML代码,这就是我发现的。 – OverLex

大量的工作之后,我发现了两个解决方案,以我自己的问题,他们更变通比真正的解决方案:

解决方案1 ​​

创建扩展FilterOutputStream中的一类,并实施必要的方法写上除了那些不需要的最终流(在上面的情况下的文件)中的每个字符,即&#13; 要写入流只需添加过滤器:

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