【问题标题】:How to deserialize a xml string along with NCR unescaping?如何反序列化 xml 字符串以及 NCR 转义?
【发布时间】:2018-03-21 17:38:49
【问题描述】:
我有一个序列化的 XML 字符串,我想将其转换为 XML 对象。但是他的字符串包含很少的数字字符引用,例如¥。我使用simplexml_load_string 进行反序列化,但它不会对这些字符进行转义。
如果我使用 html_entity_decode 取消转义,则字符串中 URL 的查询参数中的 & 也会取消转义,这会使 XML 解析器的 URL 无效。例如,
https://testURL.com?param1=a&param2=b 被转换为 https://testURL.com?param1=a&param2=b,现在 &param2 是 XML 解析器的无效字符。
一种天真的方法是在发送到 simplexml_load_string 之前将所有 &# 替换为 &#,但这可能会破坏一些事情。请让我知道更好的方法。
【问题讨论】:
标签:
php
xml
xml-parsing
simplexml
xml-deserialization
【解决方案1】:
听起来你所拥有的是被双重转义的内容;您需要取消选择它的处理顺序,然后将这些步骤倒转,以相反的顺序取回原始文本。
例如,如果您拥有的 XML 如下所示:
<thing url="https://testURL.com?param1=a&param2=b" description="blah &#xA5; blah" />
那么原来的转换很可能是:
- 手动转义描述,将
¥改为&#xA5;;保持网址不变
- 将
url 和description 添加为XML 属性,将&amp; 转义为&amp;
所以要反转,你需要:
- 反向步骤 2:提取
url 和 description 属性(使用 SimpleXML)
- 反向步骤 1:取消转义
description 值,但保持 url 值不变
给你:
// Step 1; reverses the original step 2
$sx = simplexml_load_string($xml);
$url = (string)$xml['url'];
$description = (string)$xml['description'];
// Step 2; reverses the original step 1
$description = html_entity_decode( $description );