由一次POST错误说起——论XML默认实体格式

作者:掠影
最后编辑时间:2018-12-12 13:48:42
浏览次数:975



引子

前段时间一直在从事整合Walmart API的工作,也将部分代码开源了出来Walmart API, 而在测试过程中,处理商品上架的操作时,意外地遇到了一个奇怪的错误;

情况

  • 在一次POST一个XML格式的文件后,Walmart返回了一个格式错误的提示信息,提示对一个特定格式的字符无法识别;这个问题就让人觉得非常莫名其妙了——因为前几次的POST都是非常顺利的,也没有遇到过类似的问题,为什么这次就偏偏出现了呢?
  • 追溯着报错的位置,来到了所提示的错误行/列,意外地发现这里是商品的描述信息,当前位置刚好是一个
    的HTML标签,恍然大悟,原来是由于这边的标签让XML误以为是一个闭合标签,从而导致了内容的错误标记,只需要利用PHP自带的htmlentities()就可以了嘛,将所有的标记符号转化成类似于'&gt', '&lt'这样就可以了;
  • 于是顺着这条思路,对整个商品描述信息进行了HTML实体编码,心想这样总没有问题了吧,所有特殊实体都进行了转化,这次的POST大概是成功了的;可事实永远是打脸的,返回的依然是错误,只是换了个位置罢了;
  • 这就令人非常诧异了,已经按照xml要求进行了实体编码,为什么还会报一个无法识别的错误呢?莫非是某些商品本身就存在问题?抱着这样的揣测,又找到了对应位置,发现这里是一个@符号;于是乎就有了一个猜测:是不是XML里可以识别的实体类型是有限的,故而对其他的实体就没办法鉴别了?
  • 果断Google,突然间柳暗花明:原来XML中预定义的实体是有限的,只有区区5种,即单引号,双引号,&符号以及大于小于号;超过这五种的,需要以十进制或十六进制的字符值引用的方式,才能嵌入到XML中,即对于类似于@,$之类的符号,要么保留原样,要么转化成'&#31', '&#37'这样的字符值引用,才能避免XML无法识别超出规定外的实体而报错的情况;
  • 再次尝试,解决

总结

  • XML中仅定义了五种默认实体,使用时需要注意
  • XML中不要使用HTML自带的标签,由于其中一些未闭合的标签之类的会导致意外情况,即使需要使用也要转化成实体;
  • 超出默认实体之外的情况,需要转化成字符值引用的格式,从而避免识别错误
  • 附录:已知的特殊格式转换
  • '<'=>"<",
    '>' => '>',
    '&' => '&',
    ''' => ''',
    '"' => '"',
    ' ' => ' ',
    '©' => '©',
    '®' => '®',
    '™' => '™',
    '–' => '-',
    '&iuml' => '&#239', // ¨ symbol
    '¿'=> '&#191', // reverse ?=>¿
    '½' => '&#189', // 1/2 symbol
    '•' => '&#8226' // •
    


参考:


HTML Code 列表

取消

感谢您的支持,我会继续努力的!关闭

扫码支持
大家有钱的捧个钱场,没钱的捧个人场233333

打开支付宝扫一扫,即可进行扫码打赏哦

分享到: QQ空间 更多



评论区