【问题标题】:XML DocumentBuilder removes CDATA SectionXML DocumentBuilder 删除 CDATA 部分
【发布时间】:2015-09-01 06:08:39
【问题描述】:

我在 weblogic 上有 webapp,其中
1.从数据库中读取XML
2.解析它
3.添加新部分
源 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 库。

附:当我在 tomcat 服务器或 java 应用程序上运行应用程序时,一切正常

【问题讨论】:

  • 我建议您应该做的第一件事是找出它实际上是在解析部分还是在格式化部分。查看已解析文档中的所有节点。

标签: java xml cdata


【解决方案1】:

首先,解析过程不会移除 CDATA 信息。查看一些调试信息:

第二:摆脱那些 CDATA 部分的是转换过程,因为这根本没有在规范中定义(查看 Michael Kay in this question 的答案)。

但是,您可以为转换器设置一些属性,使其能够保留这些部分:

transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "script");

现在您将在输出中看到 CDATA 部分。

【讨论】:

  • 你是对的......谢谢。设置转换器属性后,它使用 cdata 部分解析 XML
猜你喜欢
  • 1970-01-01
  • 2014-10-05
  • 2010-10-08
  • 2016-12-26
  • 1970-01-01
  • 2023-03-06
  • 2011-06-07
  • 2021-03-06
  • 1970-01-01
相关资源
最近更新 更多