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)
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 )
$xml = simplexml_load_string($string);