在xml报文发送时,某些参数是包含html标签的字符串时处理方法

在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特殊符号的转义?

特殊符号转义符
>&gt;
<&lt;
&&amp;

我明确告诉你们一下,这样的解析可以,但是后台接收到的字符串还需要在转会成原符号再保存,或者展示时候再转成原符号后展示。这样都不方便。

我这边提倡的一个做法是这样的

就是加入<![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[]]>内,字符串不能有双引号,最好换成单引号。不能有换行符,拼接前去除所有换行符在拼接,这样就好啦。

这只是个人在工作中得出来的总结。某些细节可能并没有理解透彻。如有错误地方,欢迎指出。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值