【问题标题】:PHP XML to json without losing single Tag ElementsPHP XML 到 json 不丢失单个标记元素
【发布时间】:2015-12-20 10:32:12
【问题描述】:

如何在不丢失单个标签元素的情况下将 xml 文档转换为 json?

我的 XML:

<myTag><singleTag internValue="bli bla blo"/></myTag>  

我的 PHP:

$xml = simplexml_load_string($result);  
$json = json_decode(json_encode($xml));

我的输出/结果:

myTag = Object
(
   0 = Object
   (
      @attributes = Object
      (
         internValue = String(11) "bli bla blo"
      )
   )
)

但我缺少有关名称“singleTag”的信息。它没有出现在我的结果中,但为什么?在显示所有“myTag”名称之后。

我尝试了不同的解决方案,但问题出在 json_encode 中。信息已经在这里丢失了:

"myTag":{"0":{"@attributes":{"internValue":"bli bla blo"}}}

感谢您的帮助。
问候,
克里斯托弗2007

编辑:

这是一个更好的问题示例:

$result = '<surround>
    <mainCat>
        <firstTag val1="false" val2="true" val3="false" val4="false" />
        <secondTag val1="false" val2="true" val3="false" val4="false" />
        <myTag><singleTag internValue="bli bla blo"/></myTag>
    </mainCat>
</surround>';
$xml = simplexml_load_string($result);
$json = json_decode(json_encode($xml));  

解决方案:

问题在于 PHP 版本。一开始我有 Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3 并降级到 PHP 版本 5.6.13 一切正常.
因此,再次感谢您的所有帮助,并为这样一个微不足道的错误感到抱歉:/

【问题讨论】:

  • 您给出的示例不可以用任何当前支持的 PHP 版本重现:3v4l.org/NNapP - 因此不清楚您的要求。那是哪个 PHP 版本?
  • 我也有同样的问题。在 php7.0.30-0ubuntu0.16.04.1 中工作正常。但 'singleTag' 在 php5.6.4-4ubuntu6.4 中变为 0
  • 同时将 xsd atom 转换为数组。找到任何解决方案吗?

标签: php json xml


【解决方案1】:

这其实应该是评论,但是评论太长了:

我执行问题中给出的代码

$result = '<surround>
    <mainCat>
        <firstTag val1="false" val2="true" val3="false" val4="false" />
        <secondTag val1="false" val2="true" val3="false" val4="false" />
        <myTag><singleTag internValue="bli bla blo"/></myTag>
    </mainCat>
</surround>';
$xml = simplexml_load_string($result);
$json = json_decode(json_encode($xml));

echo json_encode($xml);
echo "<br/>print_r: <br/>";
print_r($json);

http://phptester.net 得到如下结果

{"mainCat":{"firstTag":{"@attributes":{"val1":"false","val2":"true","val3":"false","val4":"false"}},"secondTag":{"@attributes":{"val1":"false","val2":"true","val3":"false","val4":"false"}},"myTag":{"singleTag":{"@attributes":{"internValue":"bli bla blo"}}}}}
print_r: 
stdClass Object ( [mainCat] => stdClass Object ( [firstTag] => stdClass Object ( [@attributes] => stdClass Object ( [val1] => false [val2] => true [val3] => false [val4] => false ) ) [secondTag] => stdClass Object ( [@attributes] => stdClass Object ( [val1] => false [val2] => true [val3] => false [val4] => false ) ) [myTag] => stdClass Object ( [singleTag] => stdClass Object ( [@attributes] => stdClass Object ( [internValue] => bli bla blo ) ) ) ) )

据我所知,没有任何信息丢失,您的 singleTag 就在那里。

所以可能是 PHP 版本的问题?你用的是什么版本的PHP?

【讨论】:

  • 这可要了我的命:D 我现在制作了一个新的空白文件,并在其中复制了您正在使用的完全相同的代码。仍然:而不是“singleTag”,我得到一个“0”。但是当我在“myTag”中复制“singleTag”标签时,它正在工作,当然原始代码没有选择,但仍然很有趣......目前,我在win7上使用localhost apache开发中:Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3 ....我现在也在一个带有 PHP 版本 5.2.17 的 Ubuntu 上尝试过它并且它可以工作......所以你我的朋友有一个非常好的主意。但它是 PHP 版本吗?还是操作系统?还是阿帕奇?
  • 很可能是 PHP 版本,尝试在两种设置上执行 phpinfo 以查看差异。
【解决方案2】:

试试这个

$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

编辑:

要遍历多维数组,可以使用RecursiveArrayIterator

$jsonIterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($json, TRUE)),
    RecursiveIteratorIterator::SELF_FIRST);

foreach ($jsonIterator as $key => $val) {
    if(is_array($val)) {
        echo "$key:\n";
    } else {
        echo "$key => $val\n";
    }
}

【讨论】:

  • 如果我尝试它给出的代码Array ( [singleTag] =&gt; Array ( [@attributes] =&gt; Array ( [internValue] =&gt; bli bla blo ) ) )
  • 我认为这是你阅读 JSON 的方式不正确,看看这个:lostechies.com/seanbiefeld/2011/10/21/…&lt;?php class XmlToJson { public function Parse ($url) { $fileContents= file_get_contents($url); $fileContents = str_replace(array("\n", "\r", "\t"), '', $fileContents); $fileContents = trim(str_replace('"', "'", $fileContents)); $simpleXml = simplexml_load_string($fileContents); $json = json_encode($simpleXml); return $json; } } ?&gt;
  • 我之前也访问过这个网站并尝试格式化字符串,但没有成功。但你是对的,问题在于 xml 转换而不是 json_encode。 “$xml”上的普通“var_dump”显示:["myTag"]=&gt; object(SimpleXMLElement)#19 (1) { [0]=&gt; object(SimpleXMLElement)#20 (1) { ["@attributes"]=&gt; array(1) { ["internValue"]=&gt; string(12) "bli bla blo" } } }
  • 我从@FTav 找到了一个名为“xml2js”的解决方案,它在这里工作:stackoverflow.com/questions/8830599/php-convert-xml-to-json 但我不能使用它,因为生成的 json 与普通的“json_en/decode”和我的完全不同代码要长一点来改变这个基本的东西。但为什么它在他的函数中工作而不是在普通的 php 函数中工作?我现在很困惑......
  • stackoverflow.com/a/8845727/2323245 json_encode 处理对象的方式不同于字符串。您可以将对象转换为字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
相关资源
最近更新 更多