【问题标题】:Transform recursive xml into Json with php使用php将递归xml转换为Json
【发布时间】:2021-07-01 04:01:05
【问题描述】:

我正在尝试通过 PHP 将 XML 转换为 Json,但我不知道如何序列化对象。基本上,我输入了一个具有递归结构的 XML 文件(file.xml),我想将其转换为 Json(out.json)。

xml 文件示例:

<Transfer>
 <Name>Transfer</Name>
 <Title>Transfer + Date</Title>
 <Level1>
   <Name>Item 1</Name>
   <Title>Title 1</Title>
   <className>middle-level</className>
   <Level2>
      <Name>Item 1.1</Name>
      <Title>Title 1.1</Title>
      <className>product-dept</className>
   </Level2>
   <Level2>
      <Name>Item 1.2</Name>
      <Title>Title 1.2</Title>
      <className>product-dept</className>
      <Level3>
          <Name>Item 1.2.1</Name>       
          <Title>Title 1.2.1</Title>            
          <className>pipeline1</className>        
      </Level3>        
      <Level3>            
          <Name>Item 1.2.2</Name>            
          <Title>Title 1.2.2</Title>            
          <className>pipeline1</className>        
      </Level3>
    </Level2>  
  </Level1>  
  <Level1>    
    <Name>Item 2</Name>    
    <Title>Title 2</Title>    
    <className>middle-level</className>  
  </Level1>
</Transfer>

所需的 JSON 输出:

{
    'name': 'Transfer',
    'title': 'transfer Date',
    'children': [
      { 'name': 'Item 1', 'title': 'Title 1', 'className': 'middle-level',
        'children': [
          { 'name': 'Item 1.1', 'title': 'Title 1.1', 'className': 'product-dept' },
          { 'name': 'Item 1.2', 'title': 'Title 1.2', 'className': 'product-dept',
            'children': [
              { 'name': 'Item 1.2.1', 'title': 'Title 1.2.1', 'className': 'pipeline1' },
              { 'name': 'Item 1.2.2', 'title': 'Title 1.2.2', 'className': 'pipeline1' },
            ]
          }
        ]
      },
      { 'name': 'Item 2', 'title': 'Title 2', 'className': 'middle-level'}
    ]
  }

所有这一切都使用 php 代码:

$xml = simplexml_load_file("file.xml");
$result = [];

foreach ($xml->Level1 as $value) 
{
    
    $child = [];
    $child['Name'] = (string)$value->Name;
    $child['Title'] = (string)$value->Title;
    $child['className'] = (string)$value->className;


    foreach ($xml->Level2 as $level2)
    {
        $child = [];
        $child['Level2'] = (string)$value->Level2->Name;
    }

    $result[] = $child;
    
}

$json_string = json_encode($result);
print_r($json_string);

目前,我只是在转换图表的一部分,但我不明白如何做更多。 我认为我想做的事情并不太复杂但我被阻止了。

感谢您的帮助。

【问题讨论】:

    标签: php json xml


    【解决方案1】:

    试试这个

        $xml = simplexml_load_string($xml);
        $result = [];
        $result['name'] = (string)$xml->Name;
        $result['title'] = (string)$xml->Title;
    
        foreach ($xml->Level1 as $value)
        {
    
            $child = [];
            $item = [];
            $item['name'] = (string)$value->Name;
            $item['title'] = (string)$value->Title;
            $item['className'] = (string)$value->className;
    
            foreach ($value->Level2 as $level2)
            {
                $child2 = [];
                foreach ($level2->Level3 as $level3) {
                    $child2[] = array(
                        'name' => (string)$level3->Name,
                        'title' => (string)$level3->Title,
                        'className' => (string)$level3->className,
                    );
                }
                $child[] = array(
                    'name' => (string)$level2->Name,
                    'title' => (string)$level2->Title,
                    'className' => (string)$level2->className,
                    'children' => $child2,
                );
            }
    
            $item['children'] = $child;
            $result['children'][] = $item;
        }
        $json_string = json_encode($result);
        print_r($json_string);
    

    【讨论】:

      【解决方案2】:

      使用未知深度的结构时,堆栈通常是您最好的朋友:

      function xmlToJson($node, $level = 1)
      {
          $children = [];
          if (isset($node->${'Level' . $level})) {
              foreach ($node->${'Level' . $level} as $value) {
                  $children[] = [
                      'name' => (string)$value->Name,
                      'title' => (string)$value->Title,
                      'className' => (string)$value->className,
                      'children' => xmlToJson($value, $level + 1),
                  ];
              }
          }
      
          return $children;
      }
      
      

      此代码将从第一级开始并获取所有名称、标题和类名。然后它调用自己,创建一个recursive function。因此,您需要确保该级别存在,因此在实际访问该级别之前需要if (isset(...))

      如果函数停止调用自身,则函数将终止,此时没有更多级别可以下降。

      【讨论】:

        猜你喜欢
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 2018-07-30
        • 2021-07-19
        • 2012-05-14
        • 2019-07-31
        • 2023-01-23
        相关资源
        最近更新 更多