在 PHP 中不带 json_encode 将 XML 转换为 JSON

Convert XML to JSON without json_encode in PHP

我试图在不使用 json_encode/json_decode 的情况下将 XML 转换为 JSON。我有以下代码,请记住我是 PHP 和 JSON.

的新手
<?php
$myXMLData = 
"<test>
   <info>
      <sample>
         <sampleOne>test</sampleOne>
         <sampleTwo>test two</sampleTwo>
         <values value='today'>
            <sampleThree>test three</sampleThree>
            <sampleFour>test four</sampleFour>
                <sampleFive>
                    <sampleSix>test six</sampleSix>
                </sampleFive>   
         </values>
      </sample>
    </info>
</test>";

$contents=simplexml_load_string($myXMLData) or die("Error: Cannot create object");

//print_r($contents);

echo '{"' . $contents->getName() . '":{"';

foreach ($contents->children() as $child1)
{ 
    $child1->count();
    echo $child1->getName() . '": {"';
    echo $child1->attributes();
    echo $child1[0];

    foreach ($child1->children() as $child2)
    { 
        $child2->count();
        echo $child2->getName() . '": {"';
        echo $child2->attributes();
        echo $child2[0] . ": ";

        foreach ($child2->children() as $child3)
        {
            $child3->count();
            echo $child3->getName() . '": {"';
            echo $child3->attributes();
            echo $child3[0];

            foreach ($child3->children() as $child4)
            { 
                $child4->count();
                echo $child4->getName();
                echo $child4->attributes();
                echo $child4[0];


                foreach ($child4->children() as $child5)
                {
                    echo $child5->getName();
                    echo $child5->attributes();
                    echo $child5[0];
                }
            }
        }
    }
}
echo "}";
?>

结果应该看起来像一个 JSON 文件,但我卡在这里了。

{
  "test": {
    "info": {
      "sample": {
        "sampleOne": "test",
        "sampleTwo": "test two",
        "values": {
          "-value": "today",
          "sampleThree": "test three",
          "sampleFour": "test four",
          "sampleFive": { "sampleSix": "test six" }
        }
      }
    }
  }
}

我不确定这样做是否是一个好方法。但我已经在这上面花了几个小时,但我似乎找不到解决办法。

如评论中所述,递归是实现此目的的方法。您基本上需要一个函数,该函数获取一个 SimpleXMLElement 作为参数,并以每个 child 作为参数递归调用自身。这应该让您了解如何执行此操作(虽然没有属性处理,也没有多个 children 的逗号):

$masterNode = simplexml_load_string($string);
convertNodeToJSON($masterNode);

function convertNodeToJSON($node) {
    if ($node->count === 0) { // the current node is text
        echo '"' . $node->getName() . '"';
        return;
    }
    echo '{ "' . $node->getName() . '" : ';
    foreach ($node->attributes as $attr) {
        // handle attributes
    }
    foreach ($node->children() as $child) {
        convertNodeToJSON($child);
        // add a comma if necessary
    }
    echo "}";
}

代码未经测试,但它只是一个起点。希望这会有所帮助:)