在 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 "}";
}
代码未经测试,但它只是一个起点。希望这会有所帮助:)
我试图在不使用 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 "}";
}
代码未经测试,但它只是一个起点。希望这会有所帮助:)