【问题标题】:Handling CDATA escaped XML in Freemarker在 Freemarker 中处理 CDATA 转义的 XML
【发布时间】:2012-03-08 09:01:01
【问题描述】:

我在我的项目中使用 Freemarker 从一个 XML 文档转换到另一个。 由于糟糕的设计或规范消息格式的选择,我们的供应商选择在 CDATA 转义字段中嵌入一些 XML,可能是因为他们选择的消息标准不能处理所有类型的扩展。无论出于何种原因,我现在都需要深入研究这个领域并进行一些 xpath 查询。

说即:

<Invoice>
  ..
  <Note><![CDATA[<?xml version="1.0" encoding="utf-8"?><a><b>Value</b></a>]]></Note>
</Invoice>

有人知道如何在这种情况下获取值“a/b/text()”吗?

我曾考虑尝试手动清理 CDATA 部分,然后将其解析为 XML,但我希望 Freemarker 可以为我做到这一点。

【问题讨论】:

  • 非常恶搞...我认为我的问题很清楚。对于所有的 XML 狂热分子:是的,我知道您不应该解析 CDATA 部分。上过那节课,完全同意。但在这种情况下,我别无选择,因为供应商很大,很遗憾不会听我对 XML 标准的看法。

标签: xml freemarker cdata


【解决方案1】:

FreeMarker 不解析 XML,它只是调用通常的 API 来执行此操作,因此 FreeMarker 在这里无能为力。您必须将 XML 文件加载到 Stringchar[] 或其他)中,删除那些 CDATA“标签”,然后使用 javax.xml.parsers.DocumentBuilder 将生成的 String 解析为 DOM 树,并将其传递给 FreeMarker。不过,您可能想在此之前致电NodeMode.simplify(theDomTree)

【讨论】:

  • 你是对的。我错过了说我已将包装 XML 解析为 DOM 并在 FM 中使用 XPath 查询来获取各个字段。我的解决方案是将实用程序类绑定到 bean 并将 CDATA 字段与 bean 评估的 XPath 表达式一起发送给它。不是最流畅的解决方案,但它确实有效。
【解决方案2】:

我认为您关于重新解析 XML 的建议可能是您最好的选择。 CDATA 表示应该这样对待:字符数据。

【讨论】:

    【解决方案3】:

    这篇文章有点陈旧,但为什么不在你的 cdata 中使用 content:encoded 标记呢?

    <content:encoded><![CDATA[ ${ body } ]]> </content:encoded>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-07
      • 2021-02-12
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2010-12-11
      • 2014-06-19
      • 1970-01-01
      相关资源
      最近更新 更多