• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Php + Xml

perocha2003

GF Bronze
Membro Inactivo
Entrou
Jan 19, 2008
Mensagens
24
Gostos Recebidos
0
Boas a todos.
Sou iniciante no php, estou a desenvolver uma aplicação web e estou a precisar de uma ajuda.

Então é o seguinte:
Pretendo um script php que leia todo o conteudo de uma pasta e subpastas.
o resultado apresentado é o caminho desses ficheiros/pastas como vou demonstrar com o codigo 1.
Codigo 1

<?php

$dir = "directorio a apresentar";

function tree($it){
echo '<ul>';
for(; $it->valid(); $it->next()){
if($it->isDir() && !$it->isDot()) {
printf('<li class="dir">%s</li>', $it->current());
if($it->hasChildren()) {
$bleh = $it->getChildren();
echo '<ul>' . tree($bleh) . '</ul>';
}
}
elseif($it->isFile()) {
echo '<li class="file">'. $it->current() . '</li>';
}
}
echo '</ul>';
}

tree(new RecursiveDirectoryIterator($dir));


?>

Agora o que pretendo é que este resultado seja enviado para um ficheiro xml. como apresento no codigo 2

codigo 2

<?php
$dir = "directorio a apresentar";
$dados = "";


if (is_dir($dir)) {
$arquivo = "directorios.xml";
$point = fopen($arquivo, "w");
fwrite($point, "<?xml version='1.0' encoding='utf-8'?>");
fwrite($point, "<dados>");
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if($file{0}!="."){
$dados .= "<file file='$file' />";
}
}
closedir($dh);
}
fwrite($point, $dados);
fwrite($point, "</dados>");
fclose($point);
}

?>

espero que me tenha feito entender.
Agradeço a vossa ajuda.
Cumps...
Perocha2003
 

maar3amt

Administrator
Team GForum
Entrou
Set 19, 2006
Mensagens
7,803
Gostos Recebidos
28
Vamos a ver se compreendi!

O que pretendes é uma função para listar os ficheiros de uma determinada pasta e respectivas sub-pastas correcto?

Mas como pretendes montar as informações dos ficheiros?

Os ficheiros são para mostrar todos ao mesmo nível?

Exemplo de xml:

<?xml version='1.0' encoding='utf-8'?>
<dados>
<file file='$file(link para o ficheiro)' />
</dados>
Será o exemplo acima que pretendes?
 

perocha2003

GF Bronze
Membro Inactivo
Entrou
Jan 19, 2008
Mensagens
24
Gostos Recebidos
0
Bom dia maar3amt

Obrigado pela resposta ao post.
É o seguinte o file xml tem de apresentar os ficheiros e as pastas.
A apresentação tem de mostrar o caminho completo do ficheiro ou pasta.
Ou seja, o que pretendia mesmo era o resultado do codigo 1 num ficheiro em xml.

cumps...
perocha2003
 

maar3amt

Administrator
Team GForum
Entrou
Set 19, 2006
Mensagens
7,803
Gostos Recebidos
28
Boas amigo não sei se compreendi bem no entanto aqui fica a função com respectivo output configurado para gerar um xml com todos os ficheiros!

Espero que seja isto!

<?php
$directorio = "empresarial"; //Indica o directorio sem / no fim

//Função de listagem de ficheiros de pasta e respectivas sub-pastas
function MostraFiles($dir) {

if($dh = opendir($dir)) {

$files = Array();
$inner_files = Array();

while($file = readdir($dh)) {
if($file != "." && $file != ".." && $file[0] != '.') {
if(is_dir($dir . "/" . $file)) {
$inner_files = MostraFiles($dir . "/" . $file);
if(is_array($inner_files)) $files = array_merge($files, $inner_files);
} else {
array_push($files, $dir . "/" . $file);
}
}
}

closedir($dh);
return $files;
}
}

//Output do ficheiro em xml
header ("content-type: text/xml");
$gera_xml = "<?xml version=\"1.0\"?>\n";
$gera_xml .= "<dados>\n";

foreach (MostraFiles($directorio) as $key=>$file){
$gera_xml .= "<file file=\"$file\" />\n";
}
$gera_xml .= "</dados>\n";

echo $gera_xml;
?>
 

perocha2003

GF Bronze
Membro Inactivo
Entrou
Jan 19, 2008
Mensagens
24
Gostos Recebidos
0
Boas amigo
Obrigada pela ajuda...
O codigo está a gerar um erro, vou tentar resove-lo.

XML Parsing Error: junk after document element
Location: http://*****//*****/diretoriotoxml.php
Line Number 2, Column 1:<b>Fatal error</b>: Call to undefined function ListFiles() in <b>C:\wamp\www\teste\diretoriotoxml.php</b> on line <b>15</b><br />

Cumps...
perocha2003
 
Última edição:

perocha2003

GF Bronze
Membro Inactivo
Entrou
Jan 19, 2008
Mensagens
24
Gostos Recebidos
0
Boas
Já resolvi o erro, foi só trocar na linha 15 ListFiles por MostraFiles.

Cumps...
Perocha2003
 

maar3amt

Administrator
Team GForum
Entrou
Set 19, 2006
Mensagens
7,803
Gostos Recebidos
28
Sim de facto foi erro meu ao declarar a função!

Espero que seja isso que andas à procura!

Abraços
 

perocha2003

GF Bronze
Membro Inactivo
Entrou
Jan 19, 2008
Mensagens
24
Gostos Recebidos
0
Boas amigo
Não é bem isso que eu pretendo, a parte do caminho completo do file, é isso mesmo que pretendo. Tem é que ser listado como no codigo 1
Isto num file xml que vai ser gerado pelo php.
Tem de ser criado um file "directorios.xml"
No primeiro post tenho o codigo 1 a gerar uma lista na extrutura que eu pretendo. Agora o que preciso é que este resultado do codigo 1 seja criado num file xml com o nome "directorios.xml

Desde já muito obrigado pela disponibilidade.

Cumps...
Perocha2003
 
Última edição:

maar3amt

Administrator
Team GForum
Entrou
Set 19, 2006
Mensagens
7,803
Gostos Recebidos
28
Vamos lá então, a alteração é super fácil, veja-mo se é isto!

O script seguinte é nada mais nada menos que o de cima mas ao invés de mostrar o xml na própria página vai actualizar ou criar o ficheiro directorios.xml!

<?php
$directorio = "empresarial"; //Indica o directorio sem / no fim

//Função de listagem de ficheiros de pasta e respectivas sub-pastas
function MostraFiles($dir) {

if($dh = opendir($dir)) {

$files = Array();
$inner_files = Array();

while($file = readdir($dh)) {
if($file != "." && $file != ".." && $file[0] != '.') {
if(is_dir($dir . "/" . $file)) {
$inner_files = MostraFiles($dir . "/" . $file);
if(is_array($inner_files)) $files = array_merge($files, $inner_files);
} else {
array_push($files, $dir . "/" . $file);
}
}
}

closedir($dh);
return $files;
}
}
function criaXML($content) {
$fop = fopen("directorios.xml","w");
fwrite($fop,$content);
fclose($fop);
}
$gera_xml = "<?xml version=\"1.0\"?>\n";
$gera_xml .= "<dados>\n";

foreach (MostraFiles($directorio) as $key=>$file){
$gera_xml .= "<file file=\"$file\" />\n";
}
$gera_xml .= "</dados>\n";

criaXML($gera_xml);

Será isto?
 

perocha2003

GF Bronze
Membro Inactivo
Entrou
Jan 19, 2008
Mensagens
24
Gostos Recebidos
0
Boas amigo
Impecavel é isto mesmo que queria, obrigada.
Só falta um pormenor, o xml é apresentado assim:
<file file="c:/php526xd/dev" />
<file file="c:/php526xd/dev/php5ts.lib" />

Agora pretendo que seja assim:
<dir dir="c:/php526xd/dev" />
<file file="c:/php526xd/dev/php5ts.lib" />

ou seja que as pastas tenham o dir a tráz e os files tenham o file a tráz.

Obrigada pela disponibilidade.
Cumps...
perocha2003
 

maar3amt

Administrator
Team GForum
Entrou
Set 19, 2006
Mensagens
7,803
Gostos Recebidos
28
Boas, olha uma solução que encontrei é a seguinte utilizando a tua primeira função!


1 - Crias um ficheiro gera.php e coloca lá o seguinte código:
<?php

$dir = "empresarial";

function tree($it){
for(; $it->valid(); $it->next()){
if($it->isDir() && !$it->isDot()) {
printf("<file dir=\"%s\" />\n", $it->current());
if($it->hasChildren()) {
$bleh = $it->getChildren();
echo ''.tree($bleh).'';
}
}
elseif($it->isFile()) {
echo "<file file=\"". $it->current() . "\" />\n";
}
}
}
echo "<?xml version=\"1.0\"?>\n";
echo "<dados>\n";
tree(new RecursiveDirectoryIterator($dir));
echo "</dados>\n";
?>


Agora crias outro ficheiro xml.php responsável por ler e criar o directorios.xml:
<?php
$linkr = "http://localhost/dir.php";
function grava($link,$file)
{
$cont="";
$fp = fopen($link,"r");
while(!feof($fp))
{
$cont .= fread($fp,50000);
}
fclose($fp);

$fp2 = fopen($file,"w");
fwrite($fp2,$cont);
fclose($fp2);
}

grava($linkr, "directorios.xml");

?>

Nesta última a variável $linkr tem de conter o link para o ficheiro gera.php, pois esta última função utiliza o gera.php para obter o conteúdo do directorios.xml!

Espero que dê para desenrascar!
 

perocha2003

GF Bronze
Membro Inactivo
Entrou
Jan 19, 2008
Mensagens
24
Gostos Recebidos
0
Thanks my friend
You are the best :espi28:

Era isso mesmo que pretendia, vamos ver se dá para o que preciso...

Cumps...
Perocha2003
 

maar3amt

Administrator
Team GForum
Entrou
Set 19, 2006
Mensagens
7,803
Gostos Recebidos
28
De nada...
Espero que esta ajuda tenha sido útil!:espi28:
 

perocha2003

GF Bronze
Membro Inactivo
Entrou
Jan 19, 2008
Mensagens
24
Gostos Recebidos
0
Boas maar3amt

Estou de volta ao php :shy_4_02: depois de uns tempos a estudar o Action Script.

Voltando a utilizar o file php que me ajudaste a fazer deparei-me com um problema, já andei a dar voltas para resolver mas o tempo que estive parado no php deixou-me ainda mais :Espi37:

Bem então é o seguinte o file que me fizeste:

<?php

$dir = "c:/.....";

function tree($it){
for(; $it->valid(); $it->next()){
if($it->isDir() && !$it->isDot()) {
printf("<dir dir=\"%s\"/>\n", $it->current());
if($it->hasChildren()) {
$bleh = $it->getChildren();
echo ''.tree($bleh).'';
}
}
elseif($it->isFile()) {
echo "<file file=\"". $it->current() . "\" />\n";
}
}
}
echo "<?xml version='1.0' encoding='utf-8'?>\n";
echo "<dados>\n";
tree(new RecursiveDirectoryIterator($dir));
echo "</dados>\n";
?>

apresenta o xml:

<?xml version="1.0" encoding="utf-8" ?>
- <dados>
<dir dir="c:/...\dev" />
<file file="c:/....\dev\......lib" />
<dir dir="c:/...\ext" />
<file file="c:/...\ext\......dll" />
</dados>

agora pretendia que fize-se o seguinte:

<?xml version="1.0" encoding="utf-8" ?>
- <dados>
<dir dir="c:/...\dev" >
<file file="c:/....\dev\......lib" />
</dir>
<dir dir="c:/...\ext" >
<file file="c:/...\ext\......dll" />
</dir>
</dados>

Ou seja o que pretendo é que a tag dir seja fechada depois de apresentar os files contidos dentro do referido directório.

Muito obrigada
perocha2003
 

maar3amt

Administrator
Team GForum
Entrou
Set 19, 2006
Mensagens
7,803
Gostos Recebidos
28
Boas amigo desculpa não consegui compreender bem o que pretendes.
Será que dá para explicar melhor?
 

Alkaria

GF Ouro
Entrou
Fev 2, 2007
Mensagens
773
Gostos Recebidos
0
Amigo perocha tambem não entendo o que pretendes porfavor esplica-te melhor.
 

perocha2003

GF Bronze
Membro Inactivo
Entrou
Jan 19, 2008
Mensagens
24
Gostos Recebidos
0
Boas é o seguinte o script php que refiro devolve um xml com esta estrutura:

<?xml version="1.0" encoding="utf-8" ?>
- <dados>
<dir dir="c:/..." />
<file file="c:/....\x.lib" />
<dir dir="c:/...\ext" />
<file file="c:/...\ext\y.dll" />
</dados>

este xml está a fechar a tag <dir dir="c:/..." /> o que eu pretendo é que ele apenas feiche a tag <dir depois de apresentar os ficheiros que estão dentro dela.
Em vez de ficar
<dados>
<dir dir="c:/..." />
<file file="c:/....\x.lib" />
<dir dir="c:/...\ext" />
<file file="c:/...\ext\y.dll" />
</dados>

ficar

<dados>
<dir dir="c:/..." >
<file file="c:/....\x.lib" />
</dir>
<dir dir="c:/...\ext" >
<file file="c:/...\ext\y.dll" />
</dir>
</dados>

espero que tenham percebido...

muito obrigado
perocha2003
 

maar3amt

Administrator
Team GForum
Entrou
Set 19, 2006
Mensagens
7,803
Gostos Recebidos
28
Será isto que pretendes?

<?php

$dir = "empresarial";

function tree($it){
for(; $it->valid(); $it->next()){
if($it->isDir() && !$it->isDot()) {
printf("<dir dir=\"%s\" />\n", $it->current());
if($it->hasChildren()) {
$bleh = $it->getChildren();
echo ''.tree($bleh).'';
}
}
elseif($it->isFile()) {
echo "<file file=\"". $it->current() . "\" />\n";
}
}
echo"</dir>\n";
}
echo "<?xml version=\"1.0\"?>\n";
echo "<dados>\n";
tree(new RecursiveDirectoryIterator($dir));
echo "</dados>\n";
?>
 

perocha2003

GF Bronze
Membro Inactivo
Entrou
Jan 19, 2008
Mensagens
24
Gostos Recebidos
0
Boas amigo é isso mesmo...
Essa alteração já eu tinha experimentado e dava-me o mesmo erro que esse dá, por isso decidi pedir ajuda...

<?php

$dir = "empresarial";

function tree($it){
for(; $it->valid(); $it->next()){
if($it->isDir() && !$it->isDot()) {
printf("<dir dir=\"%s\" />\n", $it->current());
if($it->hasChildren()) {
$bleh = $it->getChildren();
echo ''.tree($bleh).'';
}
}
elseif($it->isFile()) {
echo "<file file=\"". $it->current() . "\" />\n";
}
}
echo"</dir>\n";
}
echo "<?xml version=\"1.0\"?>\n";
echo "<dados>\n";
tree(new RecursiveDirectoryIterator($dir));
echo "</dados>\n";
?>

substituindo o /> por > evita esse erro mas depois dá outro...

Muito obrigado
perocha2003
 
Topo