翻译包含HTML样式的XML文档 (CDATA篇)
在上一篇文中,我们说明了,如果 XML 文中包含实体和 HTML 样式的内容,应该如何翻译。
那么这一篇,我会讲另一种XML 中包含 HTML 的文本,也就是包含 CDATA 的文档。
包含CDATA的XML也是应用程序本地化中常遇到的一种文档格式。
我们先来看它长什么样子:
我们发现它是符合 XML 标准的:
第一行说明语句:
<?xml version="1.0" standalone="no"?>
第二行和最后一行根元素:
<doc>
中间有
<para>
是<doc>
的子元素。
但是也有点不一样,就是多了一些<![CDATA[...]]
的东西。
这就是 CDADA 文档。
那么它到底是个什么,又该如何翻译呢?
今天带大家看看~
如果我讲的不对,还请各位来批评啦~~~
什么是 CDADA?
我们知道,计算机在读取编程文件的时候,是一行一行来读的。
我用前面的 XML 文档为例。
计算机就会先读取第一行:<?xml version...?>
,然后计算机就知道了:“哦,原来是个xml文档,要识别为XML文档~”。
然后继续往下读<sample>
,“哦,是个示例呀~”。
可是如果遇到走不通的地方,计算机读不懂,就会提示你:“哎呀,出错惹,我读不懂啊”。(这就是我们经常说的报错。)
可是为什么会有报错呢?可能的原因有:
你的代码逻辑有问题。或者
这是个XML文档,你写的不是XML样式,所以你跟它说,它确实读不懂。(就像你跟一个不懂汉语的人说汉语,说的明明都是人话,就是无法交流。)
第一个原因我就不说了,自身原因自己找找看咯~
第二个原因,怎么解决呢?
改成它能懂得语言;——比如我们前面讲的可以改为实体,如果
'
读不懂,就改为'
既然读不懂,就别难为计算机了,跳过吧。——比如通过 CDATA 就是一种解决方法。
怎么解决呢?我们看看 CDATA 是什么。
CDATA 的全名是 character data。
在 XML 文档中,文本均会被计算机读取和解析,但是被 CDATA 包起来的文本除外。
比如某些代码,包含像 <
、 >
、&
等字符,我们可以将其定义为 CDATA,这样计算机就不会读这部分内容,也就会减少出错了。
CDATA 部分由<![CDATA["
开始,由 "]]>
结束:
我们还是以本文开篇的 CDATA 文档为例,这次我们用 Chrome 打开看一下。
我们发现,由 CDATA 包起来的内容是没有读取的哦~
计算机想:“遇到 CDATA,我干脆不读了,就不出错了嘛对不对~”。
是的,的确是这样,可是也不对。
我们其实想要的结果是:
我不管你是什么Java XML HTML 语言,你还是要读的,也还是要翻译的。
(当然了,辛辛苦苦写出来肯定是要用的,既然要用,当然要翻译了。)
这可如何是好呢?遇到 CDATA 该怎么翻译呢?
不要着急,都可以解决~
如何翻译包含CDATA 的XML?
我们先看源文档:
其实不是不能读,是不能用 XML 读了。要用它支持的语言读。
就像我们搞翻译一样,如果遇到原文本(英语)中夹杂了法语,难道你不翻译了?当然不是,不是不翻译了,是不把原文本作为英语翻译,而是要翻法语。
所以:如果要翻译出 CDATA 的部分,必须要知道 CDATA 包起来的部分是什么。
在这个例子中,我们发现,其实被 CDADA 包起来的内容是 HTML 样式,像<p>
、<b>
都是,当然也有实体,像&amul;
、ö
。
所以这就简单了嘛,我们还是用层叠过滤器:
既然是XML文档,那第一层过滤器还是用 XML 过滤器;
既然 CDATA 部分是 HTML 样式,那第二层我们就用 HTML 过滤器。
当当当当~
我丢~竟然在最后一行有个漏网之鱼:
####NAME####
没关系,我继续加过滤器,加一层正则表达式标注器,标记为标签。
搞定!该是段落识别为段落,该是标签识别为标签,该是特殊字符的还原特殊字符~
真棒!
记得怎么用正则标注标签吗?不记得看这里回顾:正则篇(六):用正则将文本标记为标签
操作视频
上完整操作:
好啦~今日分享结束~你学会了吗~
后面会继续分享:DTD与XML文档,继续关注啦~(我也不知道什么时候写好~但是我保证很快惹~)
你还想学什么,欢迎来问~