在Freemarker中处理CDATA转义XML

在Freemarker中处理CDATA转义XML,xml,freemarker,cdata,Xml,Freemarker,Cdata,我在项目中使用Freemarker从一个XML文档转换到另一个XML文档。 由于糟糕的设计或对规范消息格式的选择,我们的供应商选择在CDATA转义字段中嵌入一些XML,这可能是因为他们选择的消息标准不能处理所有类型的扩展。不管出于什么原因,我现在需要深入研究这个领域并进行一些xpath查询 比如说: <Invoice> .. <Note><![CDATA[<?xml version="1.0" encoding="utf-8"?><a>

我在项目中使用Freemarker从一个XML文档转换到另一个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可能是最好的选择。这意味着它应该被视为:字符数据。

FreeMarker不解析XML,它只是调用常用的API-s来解析XML,所以FreeMarker在这里无能为力。您必须将XML文件加载到
String
char[]
或任何东西)中,删除那些CDATA“标记”,然后使用
javax.XML.parsers.DocumentBuilder
将结果
字符串
解析到DOM树中,并将其传递给FreeMarker。不过,在此之前,您可能需要调用NodeMode.simplify(目录树)。

这篇文章有点过时了,但为什么不在cdata中使用content:encoded标记呢

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


非常顽皮。。。我觉得我的问题很清楚。对于所有XML狂热者来说:是的,我知道不应该解析CDATA节。我上过那堂课,完全同意。。但在这种情况下,我别无选择,因为供应商很大,很不幸,我不会听小我对XML标准的看法。我没有说我已经将包装XML解析为DOM,并在FM中使用XPath查询来获取各个字段。我的解决方案是将实用程序类绑定到bean,并将CDATA字段与bean计算的XPath表达式一起发送给它。这不是最平滑的解决方案,但它确实有效。