2

我在使用标准 java 对象创建 XML 时遇到了一个非常严重的问题,我的代码如下:

//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>

我在谷歌和这里也查到了这个问题,但似乎没有解决方案或解决方法。

4

1 回答 1

0

经过大量工作,我找到了两种解决我自己问题的方法,它们比真正的解决方案更多:

解决方案 1

创建一个扩展 FilterOutputStream 的类,并实现必要的方法以将每个字符写入最终流(在上述情况下为 File),除了那些不需要的,即&#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 文件并修改该文件,从而强制转换器省略一些实体。

于 2012-07-10T13:20:10.420 回答