Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TransformerFactory使用命名空间处理CDATA_Java_Xml_Cdata_Jaxp_Javax.xml - Fatal编程技术网

Java TransformerFactory使用命名空间处理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

看起来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>
无法正确处理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