PHP - Преобразовать XML в Объект


Есть ли способ с PHP transfomar XML в объект и объект в xml? Пример:

** Classe (objeto) **

<?php
class Telefone {
  private $codigoArea;
  private $numero;

  public function setCodigoArea($codigoArea) {
      $this->codigoArea = $codigoArea;
  }

  public function getCodigoArea(){
      return $this->codigoArea;
  }

  public function setNumero($numero) {
      $this->numero = $numero;
  }

  public function getNumero(){
      return $this->numero;
  }
}
?>

** XML **

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<telefone>
   <codigoArea></codigoArea>
   <numero></numero>
</telefone>


** Exemplo do que preciso: **

$fone = new Telefone();
$xml = algumMetodoFuncao($fone); --> Algum metodo/função que transforme meu objeto em XML (O $fone não é uma string)
Author: Mamga, 2018-08-03

2 answers

Я Создал статический класс для вызова XMLobject, чтобы сделать это. В нем есть 2 функции:

  • gerarXML() : Получает объект и создает файл в директории, выбранной
  • gerarObjeto() : Получает xml-файл и создает объект с параметрами в файл

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

GerarXML()

Каждый xml-элемент может быть создан только если есть геттер публикую атрибута. Это означает, что если вы хотите создать элемент <nome> в xml, класс объекта должен содержать getNome().

GerarObjeto()

класс объекта, который будет создан, должен быть включен, прежде чем вызывать этот метод. в противном Случае будет возникать ошибка. Кроме того, каждый элемент xml должен сеттер в классе. Это означает, что если у вас есть элемент <sobrenome> в xml требуется setSobrenome() в класс.

Класс XMLobject

class XMLobject {

    static function gerarXML($objeto, $dir =""){

        $class = get_class ($objeto);
        $methods = get_class_methods ($class);
        $atributos = [];
        $functions = [];

        // recupera os atributos através dos metodos
        foreach($methods as $key => $method){
            if(strpos($method, "get") !== false && strpos($method, "get") === 0){
                $atributos[] = lcfirst(substr($method,3,strlen($method) -1));
                $functions[] = $method;
            }
        }

        // cria o xml com os valores dos geters
        $stringXML  = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
        $stringXML .= '<'.$class.'>';
        for($i = 0; $i < count($atributos); $i++){
            $function = $functions[$i];
            $stringXML .= '<'.$atributos[$i].'>'.$objeto->$function().'</'.$atributos[$i].'>';
        }
        $stringXML .= '</'.$class.'>';

        // gera o arquivo no diretorio informado
        file_put_contents($dir.$class.".xml",$stringXML);
    }

    static function gerarObjeto($xml_uri){
        // pega todos os elementos do arquivo xml
        $content = file_get_contents($xml_uri);
        preg_match_all('/<[\w\s\d\\"\'\.]+[^\/]>[\w\d]*/', $content, $elementos);
        $obj = null;
        foreach($elementos[0] as $key => $elemento){    
            $valores = explode(">", $elemento);
            $atributo = substr($valores[0],1, strlen($valores[0]));
            if($key == 0) {
                // gera a classe
                $obj = new $atributo();
                continue;
            }
            if(is_object($obj)){
                // insere os valores nos atributos do objeto
                $method = "set".ucfirst($atributo);
                $obj-> $method($valores[1]);
            }
        }
        return $obj;
    }

}

Пример Использования:

Создание xml

$telefone = new Telefone();
$telefone -> setNumero("9999999999");
$telefone -> setCodigoArea("11");
XMLobject::gerarXML($telefone);

Результат: (файл: Телефон.xml)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Telefone>
        <codigoArea>11</codigoArea>
        <numero>9999999999</numero>
    </Telefone>

Создание Объекта

$obj = XMLobject::gerarObjeto("Telefone.xml");
print_r($obj);

Результат:

Telefone Object ( [codigoArea:Telefone:private] => 11
[numero:Telefone:private] => 9999999999 )
 1
Author: Andrei Coelho, 2018-08-05 03:01:00
$xml = simplexml_load_string($string);
 1
Author: Leandro Sciola, 2018-08-03 14:43:03