作者:掠影
最后编辑时间:2018-12-12 13:48:42
浏览次数:2857
引子
前段时间一直在从事整合Walmart API的工作,也将部分代码开源了出来Walmart API, 而在测试过程中,处理商品上架的操作时,意外地遇到了一个奇怪的错误;
情况
-
在一次POST一个XML格式的文件后,Walmart返回了一个格式错误的提示信息,提示对一个特定格式的字符无法识别;这个问题就让人觉得非常莫名其妙了——因为前几次的POST都是非常顺利的,也没有遇到过类似的问题,为什么这次就偏偏出现了呢?
-
追溯着报错的位置,来到了所提示的错误行/列,意外地发现这里是商品的描述信息,当前位置刚好是一个
的HTML标签,恍然大悟,原来是由于这边的标签让XML误以为是一个闭合标签,从而导致了内容的错误标记,只需要利用PHP自带的htmlentities()就可以了嘛,将所有的标记符号转化成类似于'>', '<'这样就可以了;
-
于是顺着这条思路,对整个商品描述信息进行了HTML实体编码,心想这样总没有问题了吧,所有特殊实体都进行了转化,这次的POST大概是成功了的;可事实永远是打脸的,返回的依然是错误,只是换了个位置罢了;
-
这就令人非常诧异了,已经按照xml要求进行了实体编码,为什么还会报一个无法识别的错误呢?莫非是某些商品本身就存在问题?抱着这样的揣测,又找到了对应位置,发现这里是一个@符号;于是乎就有了一个猜测:是不是XML里可以识别的实体类型是有限的,故而对其他的实体就没办法鉴别了?
-
果断Google,突然间柳暗花明:原来XML中预定义的实体是有限的,只有区区5种,即单引号,双引号,&符号以及大于小于号;超过这五种的,需要以十进制或十六进制的字符值引用的方式,才能嵌入到XML中,即对于类似于@,$之类的符号,要么保留原样,要么转化成'', '%'这样的字符值引用,才能避免XML无法识别超出规定外的实体而报错的情况;
-
再次尝试,解决
总结
-
XML中仅定义了五种默认实体,使用时需要注意
-
XML中不要使用HTML自带的标签,由于其中一些未闭合的标签之类的会导致意外情况,即使需要使用也要转化成实体;
-
超出默认实体之外的情况,需要转化成字符值引用的格式,从而避免识别错误
-
附录:已知的特殊格式转换
-
'<'=>"<",
'>' => '>',
'&' => '&',
''' => ''',
'"' => '"',
' ' => ' ',
'©' => '©',
'®' => '®',
'™' => '™',
'–' => '-',
'ï' => 'ï', // ¨ symbol
'¿'=> '¿', // reverse ?=>¿
'½' => '½', // 1/2 symbol
'•' => '•' // •
-
参考:
HTML Code 列表
大家有钱的捧个钱场,没钱的捧个人场233333
评论区