XML DocumentBuilder 删除了 CDATA 部分
XML DocumentBuilder removes CDATA Section
我在 weblogic 上有 webapp,它
1.reads XML 来自数据库
2.parses吧
3.adds 新栏目
来源 XML 有 CDATA 部分
<?xml version="1.0" encoding="UTF-8" ?>
<script type="calcscript">
<![CDATA[ some data ]]>
</script>
当我解析时xml
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document xml = builder.parse(new ByteArrayInputStream(bytes));
它删除了 CDATA 部分!
返回转换为字符串后
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StringWriter sw = new StringWriter();
Result output = new StreamResult(sw);
Source input = new DOMSource(xml);
transformer.transform(input, output);
我得到 XML 这样的
<?xml version="1.0" encoding="UTF-8" ?>
<script type="calcscript">
some data
</script>
为什么要删除 CDATA 部分?可能是 weblogic 包含不支持 CDATA 部分的旧 java 库。
P.S。当我在 tomcat 服务器上 运行 应用程序或 java 应用程序时一切正常
首先,解析过程并没有去除CDATA信息。查看一些调试信息:
其次:正是转换过程摆脱了那些 CDATA 部分,因为这根本没有在规范中定义(查看 Michael Kay in this question 的回答)。
但是,您可以为转换器设置一些属性,使其能够保留这些部分:
transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "script");
现在您将在输出中包含 CDATA 部分。
我在 weblogic 上有 webapp,它
1.reads XML 来自数据库
2.parses吧
3.adds 新栏目
来源 XML 有 CDATA 部分
<?xml version="1.0" encoding="UTF-8" ?>
<script type="calcscript">
<![CDATA[ some data ]]>
</script>
当我解析时xml
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document xml = builder.parse(new ByteArrayInputStream(bytes));
它删除了 CDATA 部分!
返回转换为字符串后
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StringWriter sw = new StringWriter();
Result output = new StreamResult(sw);
Source input = new DOMSource(xml);
transformer.transform(input, output);
我得到 XML 这样的
<?xml version="1.0" encoding="UTF-8" ?>
<script type="calcscript">
some data
</script>
为什么要删除 CDATA 部分?可能是 weblogic 包含不支持 CDATA 部分的旧 java 库。
P.S。当我在 tomcat 服务器上 运行 应用程序或 java 应用程序时一切正常
首先,解析过程并没有去除CDATA信息。查看一些调试信息:
其次:正是转换过程摆脱了那些 CDATA 部分,因为这根本没有在规范中定义(查看 Michael Kay in this question 的回答)。
但是,您可以为转换器设置一些属性,使其能够保留这些部分:
transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "script");
现在您将在输出中包含 CDATA 部分。