在xml报文发送时,某些参数是包含html标签的字符串时处理方法
关键字:发送xml报文,参数是html
首先,我们都知道,xml和html是孪生兄弟,两个的格式是十分接近的。基本上,能解析xml就能解析html,当然解析成功后的处理展示效果肯定是需要人为操控的。说到这里,就应该明白。两种格式其实互相套用也能解析出来。问题不大。
OK,这个点说完了,点完了一个比较重要的地方。
那,发送xml报文时候是不是可以直接嵌入html内?
回答:No,这个不完全正确。
为什么呢?因为这块是完全看如何解析的了。一般来说,解析xml报文的格式是规定死的,某个位置你只能放这些东西举个列子
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:web="http://*******.com/" xmlns:mro="http://******.com/">
<soapenv:Header>
<tns:RequestSOAPHeader xmlns:tns="http://*******">
<tns:user>用户名</tns:user>
<tns:password>密码</tns:password>
</tns:RequestSOAPHeader>
</soapenv:Header>
</soapenv:Envelope>
在上面的报文位置,其实已经规定好<tns:user>标签里只能放字符串的、<password>标签内只能放字符串,并且,密码字符串还可能是加密过后的密文字符串。所以,在这个地方是不符合放包含html标签的字符串的。
那么,会在什么时候放包含html’标签的字符串呢?
在举一个例子
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:web="http://*******.com/" xmlns:mro="http://******.com/">
<soapenv:Header>
<tns:RequestSOAPHeader xmlns:tns="http://*******">
<tns:user>用户名</tns:user>
<tns:password>密码</tns:password>
</tns:RequestSOAPHeader>
</soapenv:Header>
<soapenv:Body>
<formValues>
data:{
date:“2020-07-17”,
name:”harin”,
age:15,
custom:"<a href='https://www.xxxx.com'>跳转到另一个系统</a>"
}
</formValues>
</soapenv:Body>
</soapenv:Envelope>
上面的内容一样的,这里加入的
<soapenv:Body>
<formValues>
data:{
date:“2020-07-17”,
name:”harin”,
age:15,
custom:"<a href='https://www.xxxx.com'>跳转到另一个系统</a>"<!--自定义位置-->
}
</formValues>
</soapenv:Body>
是重点,因为要发送数据到后台解析并保存,某个时候读取解析展示给用户查看。这里假设一个场景:这是个CSDN,在你设置自己的基本数据时候的,如姓名,生日,年龄信息。在自定义位置,你可以写任意的html标签(可以理解成一个富文本输入区)。我这里写入一个a标签用跳转。填写完成后,点击提交。
你会发现。给你提示报错。因为在这里,后台服务器的解析还是把<a>当作标签解析了。
不对呀,我这不是字符串嘛?为什么还会解析成标签?来,咱们来看看这个
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<body>
custom:"<a href='https://www.xxxx.com'>跳转到另一个系统</a>"
</body>
</html>
你们觉得这样浏览器解析出来的展示效果是怎么样的?
是 custom:"<a href=‘https://www.xxxx.com’>跳转到另一个系统</a>"
还是 custom:" 跳转到另一个系统"
不确定的小伙伴不妨复制这个代码去试试,还是有点意思的。
好,得到结果的你们。是惊喜还是喜悦?反正我是觉得自己挺蠢的。
继续往下。
既然我们知道解析出来结果是后者,也就是说a标签还是被识别出是标签了。这个时候就需要做转移了啊。用html特殊符号的转义?
特殊符号 | 转义符 |
---|---|
> | > |
< | < |
& | & |
我明确告诉你们一下,这样的解析可以,但是后台接收到的字符串还需要在转会成原符号再保存,或者展示时候再转成原符号后展示。这样都不方便。
我这边提倡的一个做法是这样的
就是加入<![CDATA[包含html标签字符串]]>
如
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://*******.com/" xmlns:mro="http://******.com/">
<soapenv:Header>
<tns:RequestSOAPHeader xmlns:tns="http://*******">
<tns:user>用户名</tns:user>
<tns:password>密码</tns:password>
</tns:RequestSOAPHeader>
</soapenv:Header>
<soapenv:Body>
<formValues>
data:{
date:“2020-07-17”,
name:”harin”,
age:15,
custom:<![CDATA[<a href='https://www.xxxx.com'>跳转到另一个系统</a>"]]>
}
</formValues>
</soapenv:Body>
</soapenv:Envelope>
改成上面这种方式,后台是不需要在做转义。对于<![CDATA[]]>的说明,大家可以百度寻找解释。
PS:还有一个比较重要的问题的。就是,包含html标签的字符串不可以有双引号,可以用单引号替换,所以在放入报文前做一个转换。可以转成单引号’或者\"。这样传输时候不会出问题。还有包含html标签的字符串不能有换行符比如\r、\n、\r\n 这种符串统统去掉。
总结:保证包含html标签字符串在<![CDATA[]]>内,字符串不能有双引号,最好换成单引号。不能有换行符,拼接前去除所有换行符在拼接,这样就好啦。
这只是个人在工作中得出来的总结。某些细节可能并没有理解透彻。如有错误地方,欢迎指出。