如何反序列化xml字符串以及NCR unescaping?

时间:2018-03-21 17:38:49

标签: php xml xml-parsing simplexml xml-deserialization

我有一个序列化的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之前用&#替换所有&#,但这可能会破坏一些事情。请让我知道更好的方法。

1 个答案:

答案 0 :(得分:0)

听起来你所拥有的内容已被双重逃脱;您需要取消处理它的顺序,并反转这些步骤,按相反顺序以取回原始文本。

例如,如果您拥有的XML如下所示:

<thing url="https://testURL.com?param1=a&amp;param2=b" description="blah &amp;#xA5; blah" />

然后可能原始的变换是:

  1. 手动转义说明,将¥更改为&#xA5;;保持URL不变
  2. urldescription添加为XML属性,将&转发至&amp;
  3. 所以要反过来,你需要:

    1. 反向步骤2:提取urldescription属性(使用SimpleXML)
    2. 反向步骤1:取消description值,但保持url值不变
    3. 给你:

      // 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 );