使用属性包含斜杠的 simplexml_load_string 将 XML 转换为数组

Posted

技术标签:

【中文标题】使用属性包含斜杠的 simplexml_load_string 将 XML 转换为数组【英文标题】:Convert XML to array using simplexml_load_string with attribute contain slash 【发布时间】:2018-04-04 16:24:29 【问题描述】:

我得到了 simplexml_load_string():实体:第 2 行:解析器错误:属性 Auth 的规范授权值 当尝试使用 php simplexml_load_string 将 xml 转换为数组时

这是我的 XML

<?xml version="1.0" encoding="utf-8"?>
<AssociateUserToPMSResponse Auth/UserToken="somestring" warning="Already existed in database">
<Success>true</Success>
</AssociateUserToPMSResponse>

当我尝试使用从 XML 中删除的整洁类 Auth/UserToken 时。 如何获取Auth/UserToken的值?

【问题讨论】:

【参考方案1】:

由于 XML 的性能不如 XML,因此可以使用 DOM 将其加载为格式不正确的 html。以下代码将加载内容 - 加载的一个轻微副作用是标记名称全部转换为小写(我在 XPath 表达式中使用 'success' 而不是 'Success')。

<?php
error_reporting ( E_ALL );
ini_set ( 'display_errors', 1 );

$xml = <<< XML
<?xml version="1.0" encoding="utf-8"?>
<AssociateUserToPMSResponse Auth/UserToken="somestring" warning="Already existed in database">
<Success>true</Success>
</AssociateUserToPMSResponse>
XML;

$doc = new DOMDocument();
libxml_use_internal_errors(TRUE);
$doc->loadHTML($xml);
$xp = new DOMXPath($doc);
$s = $xp->query("//success");
echo $doc->saveHTML($s[0]);

另外如果你输出文档的内容,你会发现第一个实体被加载为...

<associateusertopmsresponse auth warning="Already existed in database">

所以不是用 / 加载它,而是像两个属性一样加载它,第一个没有值。

【讨论】:

我要转换的 xml 有很多属性的变体,例如,Something/Things 等等 ... 我改了代码,看看有没有用。 我试过了,但是 Auth/UserToken 的值没有了。

以上是关于使用属性包含斜杠的 simplexml_load_string 将 XML 转换为数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 sed [重复] 替换包含反斜杠的字符串

带有斜杠的 Flask POST

如何删除列中最后一个正斜杠之前的文本?

a href=里面有 斜杠 反斜杠,链接出现404,是否因这斜杠原因

Java 属性反斜杠

如何使用包含斜杠字符的参数?