PHP для каждого и XML - PullRequest
       4

PHP для каждого и XML

0 голосов
/ 18 сентября 2018

Я пытаюсь понять приведенный ниже код, который получает XML и передает его в JSON. Но не спокоен, уверен, как это работает.

function splicing_json($xml){
    $str='';
    foreach($xml->children() as $child)
    {
        if(count($child)===0){
            $str .= '"'.$child->getName().'":"'.$child.'",';
        }else if(count($child)>0){
            $str .= '"' . $child->getName() . '":{';
            foreach($child->children() as $val){
                if(count($val)>0) {
                    $str .='"' . $val->getName() . '":{'.splicing_json($val).'},';
                }else if(count($val)===0){
                    $str .= '"' . $val->getName() . '":"'.$val.'",';
                }
            }
            $str .= '},';
        }
    }
    return $str;
}

1 Ответ

0 голосов
/ 18 сентября 2018

Функция splicing_json поддерживает дочерние узлы XML, она не очень эффективна и не будет работать, если у вас несколько узлов XML с одинаковым именем, но давайте возьмем этот файл XML в качестве примера:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <simple_text>Hi there!</simple_text>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <phone category="children">
     <owners category="children">
        <name>Mostafa</name>
        <address>Cairo</address>
     </owners>
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </phone>
  <game category="web">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </game>
</bookstore>

Child # 1: simple_text - это первый дочерний узел, который будет обработан функцией, это строковое значение, поэтому (count($child)===0) будет иметь значение true и будет добавлено в строку json как строковое значение "simple_text":"Hi there!",.

Дочерний элемент # 2, второй узел, который будет обрабатываться функцией, - это book, это массив, поэтому (count($child)>0) будет иметь значение true, тогда функция будет обращаться к дочерним узлам узла book, и если любой из ее узлов являетсямассив, он будет работать рекурсивно и обрабатывать его снова if(count($val)>0), в противном случае он просто добавит значение дочернего узла так же, как это было с Child # 1, а затем добавит его в переменную str.

Child # 3, этот будет обработан так же, как и дочерний # 2, но у него есть узел с именем владельцев, который содержит массив, if(count($val)>0) этот оператор вернет true, что означает, что он будет обработан повторно. bу splicing_json и тот же процесс снова будет запущен только на этом узле.затем возвращаемое функцией значение будет добавлено в основную переменную str.

Это простая рекурсивная функция, которая выполняет итерацию до тех пор, пока все узлы не будут обработаны.

, если вы декодируете ее выводдолжен выглядеть примерно так:

Array
(
    [simple_text] => Hi there!
    [book] => Array
        (
            [title] => Everyday Italian
            [author] => Giada De Laurentiis
            [year] => 2005
            [price] => 30.00
        )

    [phone] => Array
        (
            [owners] => Array
                (
                    [name] => Mostafa
                    [address] => Cairo
                )

            [title] => Harry Potter
            [author] => J K. Rowling
            [year] => 2005
            [price] => 29.99
        )

    [game] => Array
        (
            [title] => Learning XML
            [author] => Erik T. Ray
            [year] => 2003
            [price] => 39.95
        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...