Java TransformerFactory使用命名空间处理CDATA
看起来com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl在使用命名空间时未正确处理CDATA 考虑以下示例:Java TransformerFactory使用命名空间处理CDATA,java,xml,cdata,jaxp,javax.xml,Java,Xml,Cdata,Jaxp,Javax.xml,看起来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.transfor
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>
无法正确处理CDATA字段。但是,如果从转换代码和XML中删除名称空间,则文档将正确转换
需要注意的是,使用org.apache.xalan.processor.transformerfactorympl时,上述操作可以正常工作,但这不是一个选项
如何使用com.sun.org.apache.xalan.internal.xsltc.trax.transformerfactorympl正确处理带有命名空间的CDATA字段?修复错误。我怀疑这是不可能的,除非你自己修好。@MichaelKay这不是一个常见的问题吗?我之所以要使用com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl,是因为此代码在tomcat 7下运行,将xalan.jar添加到容器中只会产生更多问题。想法…?我不知道这是否是一个普遍的问题。但作为一个普通问题并不能解决它。开源软件的一个更常见的问题是,编写它的人转向其他事情,对修复bug失去兴趣。现在,如果您想要一个在Java下运行并且已经定期维护了15年的XSLT处理器,我建议您使用Saxon。。。
java -Djaxp.debug=1 -Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl CdataTest