【问题标题】:SimpleXML PHP Variable issueSimpleXML PHP 变量问题
【发布时间】:2012-09-18 20:13:00
【问题描述】:

您将在下面找到我的 xml 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>
<app>
    <version>0925</version>
    <humanVersion>0.9.25</humanVersion>
</app>

这是我的 php:

$completeurl = "ota/shingle/shingle.xml";
$xml = simplexml_load_file($completeurl);
$updateVer = $xml->version;
$updateVerHuman = $xml->humanVersion;

我正在获取 php 变量并将它们放入一个 json 字符串中,这是输出:

{"updateVer":{"0":"0925"},"updateVerHuman":{"0":"0.9.25"}}

为什么 updateVer 和 updateVerHuman 数据包含在 {} 中并且包含“0”:??我只想要那个值的数据。我如何做到这一点?

我试过了,但结果是一样的:

$updateVer = $xml->version[0];
$updateVerHuman = $xml->humanVersion[0];

【问题讨论】:

  • 尝试使用$xml-&gt;version-&gt;{0}获取名为“0”的属性的值
  • @sachleen 您误读了这个问题 - XML 中没有名为“0”的属性,当他们尝试将提取的变量编码为 JSON 时,它就会出现。
  • 也就是说和这样做是一样的:$object = new StdClass; $offset = 0; $object-&gt;$offset = '1.2.3'; var_dump(json_encode($object));
  • @ficuscr 是的,大致如此。但请记住,SimpleXML 对象不是“真正的”PHP 对象,它们是一组围绕非 PHP 数据结构的方法和运算符。因此,它们在各种序列化下的行为方式可能有些不可预测。

标签: php xml json simplexml


【解决方案1】:

当您使用 SimpleXML 访问任何子元素(甚至属性)时,您会返回另一个 SimpleXML 对象 - 这就是您可以编写 $node-&gt;child-&gt;grand_child 之类的内容的原因。

为了仅获取特定 XML 位的字符串内容,您需要使用 (string)$variable 将 SimpleXML 对象“转换”为字符串。

有时,这会发生在你身上——值得注意的是,因为你不能回显字符串以外的任何东西,echo $variable 将始终为你转换为字符串。但是,根据经验,始终将 SimpleXML 对象转换为字符串以避免以后混淆。

在您的示例中,$updateVer$updateVerHuman 在您将它们转换为 JSON 时仍然是对象。 $updateVer = (string)$xml-&gt;version; $updateVerHuman = (string)$xml-&gt;humanVersion; 应该会给出预期的结果。

【讨论】:

  • 非常感谢。感谢您的宝贵时间!
  • 感谢您的解释,我在尝试使用从 SimpleXML 收到的变量键访问数组时遇到了这个问题,但无法弄清楚为什么会收到警告:非法偏移类型。我只是假设(不好!)这是一个字符串,因为我可以回显它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多