Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

a1click_mac

problema ( xml + php )

Recommended Posts

# Galera, tenho o código abaixo, e estou conseguindo ( add ) + 1 cliente ao XML, porém o mesmo tem que ser ( add ) dentro do campo ( cliente ), mas ele só esta sendo ( add ) abaixo do campo ( cliente ), alguém pode ajudar...?\

 

# XML #


<?xml version="1.0" encoding = "UTF-8" standalone="yes" ?>
<geral>

<cliente>
<nome id="1">Jonas</nome>
</cliente>

</geral>


 

 

 

# PHP #

$xml = simplexml_load_file("teste.xml");

$xml->addChild('nome','Lukas');
$xml->nome->addAttribute("id","2");

file_put_contents ("teste.xml", $xml->asXML());

 

 

 

 

# SAÍDA ATUAL #



<geral>

<cliente>
<nome id="1">Jonas</nome>
// o certo seria ele ( AQUI ) ...
</cliente>

<nome id="2">Lukas</nome> // o CERTO é ele ficar dentro de ( CLIENTES ) assim todos os futuros cliente esterão ai

</geral>


 

 

AGUARDO GALERA!!!!

 

Alguém pra dar essa força...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você precisa primeiro adicionar outro node 'cliente', selecionar o node 'cliente' e adicionar um node 'nome'

 

$xml = simplexml_load_file("teste.xml");
;

// Conta o número de clientes no arquivo
$nc = count($xml->children());

// Adiciona um node cliente
$xml->addChild('cliente');

// Adicionar um node 'nome' com texto 'Lukas' ao node 'cliente' adicionado anteriormente
$xml->cliente[$nc]->addChild('nome','Lukas')->addAttribute("id", $nc+1);


file_put_contents ("teste.xml", $xml->asXML());

 

Saída:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<geral>
<cliente>
<nome id="1">Jonas</nome>
</cliente>
<cliente><nome id="2">Lukas</nome></cliente></geral>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas só que eu não quero fazer isso, pois preciso ter o ( nome do cliente ) dentro do nome ( cliente ) e não criar um novo ( node ) entendeu?

 

# Eu quero que o resultado fique sempre assim...

 



<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<geral>

<cliente>
<nome id="1">Jonas</nome>
<nome id="2">Lukas</nome>
<nome id="3">Pedro</nome>
// ... ( aqui sempre sera adicionado novos [nomes] sem o nome [cliente] )
</cliente>

</geral>

 

 

Sacou...? como posso fazer isso...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso só faz sentido se um cliente tiver mais de um nome... :-/

 

Bom... você é quem sabe:

 

$xml = simplexml_load_file("teste.xml");

$nomes = array("Lukas", "Pedro");

$nc = count($xml->cliente->children());

foreach ($nomes as $k => $nome)
{
 $xml->cliente->addChild('nome',$nome)->addAttribute("id", $nc+$k+1);
}

file_put_contents ("teste.xml", $xml->asXML());

 

Deu certo aí?

Compartilhar este post


Link para o post
Compartilhar em outros sites

SUPER CERTO CAMARADA!

 

- Valeu mesmo einh?! quebrou um galho tremendo que estava a quase 5 horas tentando resolver isso, tentei ( DOM ) e consegui, porem nao conseguia colocar ( atributo ) ID no DOM.

 

 

[ resolvido ]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra opção seria utilizar a classe DOMDocument

 

XML inicial

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <clients>

 </clients>
</root>

 

Script:

<?php

$filename = 'file.xml';

$DOMDocument = new DOMDocument( '1.0', 'UTF-8' );
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->formatOutput = true;
$DOMDocument->load( $filename );

$clients = $DOMDocument->getElementsByTagName( 'clients' )->item( 0 );

$names = array(
   'Carlos Coelho',
   'Mei Ling',
   'Donovan'
);

for( $i = 0; $i < count( $names ); $i++ )
{
   $client = $DOMDocument->createElement( 'name', $names[ $i ] );
   $client->setAttribute( 'id', $i + 1 );
   $clients->appendChild( $client );
}

$DOMDocument->save( $filename );

?>

 

XML final

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <clients>
   <name id="1">Carlos Coelho</name>
   <name id="2">Mei Ling</name>
   <name id="3">Donovan</name>
 </clients>
</root>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu até prefiro o DOMDocument... eu acho mais intuitivo, talvez por já estar acostumado ao DOM do JS.

 

Carlos Coelho, você que é um cara que saca das coisas... não está um tanto esquisito esse negócio de um cliente ter não sei quantos nomes?

 

Para mim, a estrutura correta mesmo seria:

 

<?xml version="1.0" encoding="UTF-8"?>
<clientes>
 <cliente id="1">
   <nome>João</nome>
   <!-- Outras informações sobre o cliente... -->
 </cliente>
 <cliente id="2">
   <nome>Sunda</nome>
 </cliente>
 <cliente id="3">
   <nome>Manoel</nome>
 </cliente>
</clientes>

 

O que você acha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra opção seria utilizar a classe DOMDocument

 

XML inicial

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <clients>

 </clients>
</root>

 

Script:

<?php

$filename = 'file.xml';

$DOMDocument = new DOMDocument( '1.0', 'UTF-8' );
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->formatOutput = true;
$DOMDocument->load( $filename );

$clients = $DOMDocument->getElementsByTagName( 'clients' )->item( 0 );

$names = array(
   'Carlos Coelho',
   'Mei Ling',
   'Donovan'
);

for( $i = 0; $i < count( $names ); $i++ )
{
   $client = $DOMDocument->createElement( 'name', $names[ $i ] );
   $client->setAttribute( 'id', $i + 1 );
   $clients->appendChild( $client );
}

$DOMDocument->save( $filename );

?>

 

XML final

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <clients>
   <name id="1">Carlos Coelho</name>
   <name id="2">Mei Ling</name>
   <name id="3">Donovan</name>
 </clients>
</root>

 

 

 

 

OOOOOPPPPSSSS ( ERROR )

 

Deu erro nisso aqui man...

 

Fatal error: Call to a member function appendChild() on a non-object in /home/novaimob/public_html/acesso-novaimob/xx/ver-xml.php on line 46

 

 

O que pode ser...? { nao modifiquei nada }

Compartilhar este post


Link para o post
Compartilhar em outros sites

@mangakah

 

Não levei em consideração a estrutura hierárquica do xml, mas posso afirmar que o correto seria seguir a estrutura proposta por você.

 

@a1click_mac

 

O script está ok, testei novamente, talvez você tenha copiado faltando alguma coisa ou o xml não possua a estrutura igual ao exemplo utilizado.

Também recomendo que você leia mais sobre XML - Extensible Markup Language

 

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, esta CERTO, eu achei o meu error amigo.

 

 

# Cara... gostaria muito do seguinte...

 

- Retornar ( todos os nomes existentes ) e poder verificar se ( x ) nome existe, e caso não exista ele ( add ), caso exista ( ele da um echo ) com o error de que o nome existe.

 

Como eu faria isso...?

* Algo como...

 


if( $nome != "Lukas" ) {

// aqui ele faz o ( update ) normal.

 }else{

echo"Nome existe, por favor informe outro";

}

 

Aguardo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria tipo assim

<?php

$filename = 'file.xml';

$DOMDocument = new DOMDocument( '1.0', 'UTF-8' );
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->formatOutput = true;
$DOMDocument->load( $filename );

$clients = $DOMDocument->getElementsByTagName( 'name' );
$search = 'Carlos Coelho';
$boolean = false;

foreach( $clients as $client )
{
   if( $client->nodeValue == $search )
   {
       $boolean = true;
       break;
   }
}

if( $boolean )
{
   echo 'nome existe';
}
else
{
   echo 'cadastro efetuado/atualizado';
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria tipo assim

<?php

$filename = 'file.xml';

$DOMDocument = new DOMDocument( '1.0', 'UTF-8' );
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->formatOutput = true;
$DOMDocument->load( $filename );

$clients = $DOMDocument->getElementsByTagName( 'name' );
$search = 'Carlos Coelho';
$boolean = false;

foreach( $clients as $client )
{
   if( $client->nodeValue == $search )
   {
       $boolean = true;
       break;
   }
}

if( $boolean )
{
   echo 'nome existe';
}
else
{
   echo 'cadastro efetuado/atualizado';
}

?>

 

 

E coloco essa ( parte ) do codigo onde?

 

- Antes de de fazer ( a atualização ) ou jogo a atualização dentro do ( else ) ?

 

# Deu certo para ( 1 ) registro, se eu tiver + de ( 1 ), ele não exibe os que estão ( corretos ) digamos assim.

 

- Imagine que eu tenho ( Lukas, Pedro, Joao )

- E para verificar se existe ( Lukas ), e os outros que são diferentes de ( Lukas ) ele deveria fazer o LOOP e também exibir como ( Nomes OK )

 

Entendeu? porque assim ele não pega os outros registro e acabam ficando sem executar os outros nomes.

 

 

# XML


<?xml version="1.0" encoding = "UTF-8" standalone="yes" ?>
<geral>

<cliente>
<nome>Lukas</nome>
<nome>Pedro</nome>
<nome>Joao</nome>
</cliente>


</geral>

 

# PHP


$filename = 'teste.xml';

$DOMDocument = new DOMDocument( '1.0', 'UTF-8' );
$DOMDocument->preserveWhiteSpace = false;
$DOMDocument->formatOutput = true;
$DOMDocument->load( $filename );

$clients = $DOMDocument->getElementsByTagName( 'nome' );
$search = 'Lukas';
$boolean = false;

foreach( $clients as $client )
{
   if( $client->nodeValue == $search )
   {
       $boolean = true;
       break;
   }
}

if( $boolean )
{
   echo 'nome existe <br>';
}
else
{
   echo 'nom nao existe <br>';
}

 

 

Eai... como resolvo isso...?

 

# TENTATIVA -> Implementar #

 

 

- Problema ao ( consultar ) XML ( foreach )

 

- Estou tentando ler esse XML, porém esta me retornando um ( ERRO )

 

 

# XML #



<?xml version="1.0" encoding="UTF-8"?>
<ListingDataFeed xmlns="http://www.vivareal.com/schemas/1.0/VRSync" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vivareal.com/schemas/1.0/VRSync">
<Header>

<!-- dados que publica -->
<Provider>site</Provider> 
<Email>contato@site.com</Email> 
<ContactName>site</ContactName> 
<Telephone>(71)1289-2330</Telephone>
<PublishDate>2012-08-11T23:25:13</PublishDate> 

<!-- logo quem publica -->
<Logo>http://www.site.com/logo_imoveis.png</Logo>
</Header> 

<Listings> 
<Listing>
<ListingID>ALU607139</ListingID>
<Title>SALAS BOULEVARD SIDE ( 4º andar)</Title> 
<TransactionType>For Rent</TransactionType> 
<Featured>true</Featured> 
<DetailViewUrl>http://www.site.com/detalhes-imovel?codigo=ALU607139</DetailViewUrl> 
<VirtualTourUrl></VirtualTourUrl>


<!-- fotos do imovel -->
<Media>

<Item medium="image" caption="nome_imagem" primary="true">http://www.site.com/simple_file/img/imoveis/imagem.jpg</Item>

<Item medium="image" caption="nome_imagem" primary="false">http://www.site.com/simple_file/img/imoveis/nova_imagem.jpg</Item>


</Media>


<!-- status -->
<Status>
<PropertyStatus>Available</PropertyStatus> 
<StatusDate>2012-08-11T23:25:13</StatusDate> 
<ClosingPrice currency="BRL">0</ClosingPrice>
</Status>

<!-- detalhes imovel -->
<Details>
<PropertyType>Sala / Prédio comercial</PropertyType>
<Description><![CDATA[ Boulevard Side Empresarial. 

Com infraestrutura moderna e completa, esse grande sucesso está no centro de tudo, a Avenida Tancredo Neves.

2 Salas vizinhas mas independentes, uma com:

- 40 m² (R$ 2.200,00) 
- 30 m² (R$ 1.800,00)

Ar condicionado e Piso por conta do inquilino.

Infra-estrutura


• Localizado num boulevard em pleno centro financeiro

• Fachada da torre 100% revestida em Alumínio Composto

• 13 elevadores de alta velocidade, sendo 04 privativos para condôminos

• 3 Auditórios com 2 salas de reunião

• Foyer

• Lobby de entrada com mais de 5 metros de pé direito

• 1060 vagas de garagem, com possibilidade de serviço de manobrista para visitantes

• Infraestrutura para ar-condicionado tipo split

• Entregue com forro de gesso ]]></Description>
<ListPrice currency="BRL">180000</ListPrice>
<RentalPrice currency="BRL" period="Daily">100</RentalPrice> 
<AvailableDate>2012-08-11T23:25:13</AvailableDate> <!-- colocar T -->
<PropertyAdministrationFee currency="USD" period="Daily">0</PropertyAdministrationFee> 
<ConstructedArea unit="square metres">0</ConstructedArea>
<LotArea unit="square metres">30,00</LotArea>
<LivingArea unit="square metres">30,00</LivingArea>
<DevelopmentLevel>Built</DevelopmentLevel> 
<YearBuilt>0</YearBuilt>
<Bedrooms></Bedrooms> <!-- quarto -->
<Bathrooms>1</Bathrooms> <!-- banheiro -->
<Suites></Suites>
<Garage type="Parking Space">1</Garage>  <!-- garagem -->
<UnitNumber></UnitNumber>
<Features>
<Feature></Feature>
</Features>
</Details> 

<!-- local imóvel -->
<Location>
<Country abbreviation="BR">Brasil</Country> 
<State abbreviation="BA">BA</State> 
<City>Salvador</City>
<Zone></Zone> 
<Neighborhood>Caminho das Árvores</Neighborhood>
<Address publiclyVisible="true">Avenida: Tancredo Neves 607</Address>
<PostalCode>41820-021</PostalCode>
<Latitude></Latitude>
<Longitude></Longitude>
</Location> 


<!-- dados quem publica -->
<ContactInfo>
<Name>site</Name> 
<Email>contato@site.com</Email> 
<Telephone>(71)1289-2330</Telephone> 
<Website>http://www.site.com</Website>
<Photo></Photo>
<Logo>http://site.com/logo_imoveis.png</Logo>
<OfficeName>site.com</OfficeName> 

<!-- localizacao quem publica -->
<Location>
<Country abbreviation="BR">Brasil</Country> 
<State abbreviation="BA">Bahia</State> 
<City>Salvador</City>
<Zone></Zone> 
<Neighborhood>Av Tancredo Neves, N 2227</Neighborhood>
<Address publiclyVisible="true">Caminho das Arvores</Address> 
<PostalCode>41820-021</PostalCode>
<Latitude></Latitude>
<Longitude></Longitude>

</Location>
</ContactInfo>

</Listing>
</Listings>
</ListingDataFeed>



 

 

# PHP


$myxml = simplexml_load_file ('teste.xml');


foreach ($myxml->Media->Item as $post) {

if( $post != "http://www.site.com/simple_file/img/imoveis/imagem.jpg"){

echo $post." - Imagem cadastrada com Sucesso!<br>";

}else{

echo $post." - Imagem existe, informe outro.<br>";


} // if


} // foreach


 

 

# ERROR #


Warning: Invalid argument supplied for foreach() in /home/site/testes/xml/ver.php on line 36

 

 

# ONDE PROCURA OS ( Item ) para exibir e verificar ( aqui que esta dando erro quando consulta )


<!-- fotos do imovel -->
<Media>

<Item medium="image" caption="nome_imagem" primary="true">http://www.site.com/simple_file/img/imoveis/imagem.jpg</Item>

<Item medium="image" caption="nome_imagem" primary="false">http://www.site.com/simple_file/img/imoveis/nova_imagem.jpg</Item>

</Media>

 

 

# A ESTRUTURA ( XML ) não pode ser alterada, tem que verificar isso no ( PHP ) como consultar e retornar isso.

 

# Como posso resolver isso, [ AJUDA GALERA ]

 

Aguardo...

 

ALGUÉM pra me ajudar a resolver esse último item?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.