看起来 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl 在使用命名空间时没有正确处理 CDATA。
考虑以下示例:
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class CdataTest {
public final String tmpDir = "/tmp";
public final String nameSpace = "http://sample.namespace.com";
public final String cdataFields = String.format("{%s}title {%s}description", nameSpace, nameSpace);
public static void main(String[] args) {
CdataTest test = new CdataTest();
String fileName = String.format("%s/%s.xml", test.tmpDir, "Feed");
String fileNameFormatted = String.format("%s/%sFormatted.xml", test.tmpDir, "Feed");
try {
test.transform(fileName, fileNameFormatted, test.cdataFields);
} catch (TransformerException e) {
e.printStackTrace();
}
}
private void transform(String source, String destination, String cdataFields) throws TransformerException {
System.out.println(cdataFields);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, cdataFields);
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new StreamSource(source), new StreamResult(destination));
}
}
使用以下 XML
<?xml version="1.0" encoding="UTF-8"?>
<entries xmlns="http://sample.namespace.com">
<entry id="1">
<title>sample title 1</title>
<description>sample description 1</description>
</entry>
<entry id="2">
<title>sample title 2</title>
<description>sample description 2</description>
</entry>
</entries>
通过显式指定 TransformerFactory 实现来运行它
java -Djaxp.debug=1 -Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl CdataTest
不能正确处理 CDATA 字段。但是,如果从转换代码和 XML 中删除命名空间,则文档将正确转换。
需要注意的是,以上使用 org.apache.xalan.processor.TransformerFactoryImpl 可以正常工作,但这不是一个选项......
如何使用 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl 正确处理具有命名空间的 CDATA 字段?