Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
# 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...
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?
<?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...?
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í?
SUPER CERTO CAMARADA!
[ resolvido ]
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>Ótima man, muito obrigado, melhorei aqui o código.
VALEU!
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?
>
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 }
@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:
Sim, esta CERTO, eu achei o meu error amigo.
Como eu faria isso...?
* Algo como...
if( $nome != "Lukas" ) {
// aqui ele faz o ( update ) normal.
}else{
echo"Nome existe, por favor informe outro";
}
Aguardo...
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';
}
?>>
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?
Entendeu? porque assim ele não pega os outros registro e acabam ficando sem executar os outros nomes.
<?xml version="1.0" encoding = "UTF-8" standalone="yes" ?>
<geral>
<cliente>
<nome>Lukas</nome>
<nome>Pedro</nome>
<nome>Joao</nome>
</cliente>
</geral>
$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...?
<?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:
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>
$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
Warning: Invalid argument supplied for foreach() in /home/site/testes/xml/ver.php on line 36
<!-- 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>
Aguardo...
ALGUÉM pra me ajudar a resolver esse último item?
Você precisa primeiro adicionar outro node 'cliente', selecionar o node 'cliente' e adicionar um node 'nome'
// 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
Saída: