【问题标题】: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&amp;param2=b" description="blah &amp;#xA5; blah" />
    

    那么原来的转换很可能是:

    1. 手动转义描述,将¥改为&amp;#xA5;;保持网址不变
    2. urldescription 添加为XML 属性,将&amp;amp; 转义为&amp;amp;

    所以要反转,你需要:

    1. 反向步骤 2:提取 urldescription 属性(使用 SimpleXML)
    2. 反向步骤 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 );
    

    【讨论】:

      猜你喜欢
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      相关资源
      最近更新 更多