【问题标题】:XML Creation using java translates CR in HTML Entity使用 java 创建 XML 将 CR 转换为 HTML 实体
【发布时间】:2012-07-04 02:26:16
【问题描述】:

我在使用标准 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>

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

【问题讨论】:

  • 我不确定,我是否正确理解了这个问题:输入数据包含 CR,而 XML 输出应该 a) 不包括它们?或者 b) 那里有一个换行符?或 c)...?
  • 输入数据包含 CR,并且 XML 输出应该只是有一个换行符,而不是像 这样的东西。然后是 CRLF。我用 Notepad++ 检查了 XML 代码,这就是我发现的。

标签: java xml utf-8 html-entities


【解决方案1】:

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

解决方案 1

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

【讨论】:

  • 对于stringEscape,它可能比str.replaceAll("\r", "")快得多。
猜你喜欢
  • 2012-05-13
  • 2023-03-03
  • 2013-10-29
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2019-04-17
相关资源
最近更新 更多