Jump to content
IvanGS

adicionar linhas a um xml

Recommended Posts

IvanGS

boas pessoal, alguém me pode dizer como faço para adicionar linhas a um ficheiro XML que já existe?

eu tenho este xml:

<?xml version="1.0" encoding="utf-8"?>
<ezplorer>
<user_details username="admin" email=""/>
</ezplorer>

e queria adicionar uma linha antes de fechar a última tag.

alguém me pdoe dizer como faço?

Share this post


Link to post
Share on other sites
IvanGS

isso já eu vi...

o meu código está assim:

function save_users() {
$cnt=count($GLOBALS["users"]);
if($cnt>0) sort($GLOBALS["users"]);

// Make PHP-File
$content='<?php 
// ensure this file is being included by a parent file
if( !defined( \'_JEXEC\' ) && !defined( \'_VALID_MOS\' ) ) die( \'Restricted access\' );
$GLOBALS["users"]=array(';
for($i=0;$i<$cnt;++$i) {
	// if($GLOBALS["users"][6]&4==4) $GLOBALS["users"][6]=7;	// If admin, all permissions
	$content.="\r\n\tarray(\"".$GLOBALS["users"][$i][0].'","'.
		$GLOBALS["users"][$i][1].'","'.$GLOBALS["users"][$i][2].'","'.$GLOBALS["users"][$i][3].'",'.
		$GLOBALS["users"][$i][4].',"'.$GLOBALS["users"][$i][5].'",'.$GLOBALS["users"][$i][6].','.$GLOBALS["users"][$i][7].',"'.$GLOBALS["users"][$i][8].'"),';			

		$useremail = $GLOBALS["users"][$i][8];
		$username = "".$GLOBALS["users"][$i][0]."";



				$xmlfile="useremail.xml";
				// Open the existing XML file or Open Buffer to the new XML file 
				$fxml = fopen($xmlfile, 'w') or die("".$error3."");
				// Start constucting the XML file 
				//set utf-8 encode
				$stringData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
				fwrite($fxml, $stringData);

				$stringData = "<ezplorer>";
				fwrite($fxml, $stringData);
				//write username
				$stringData = "<user_details username=\"$username\" email=\"$useremail\"/>";
				fwrite($fxml, $stringData);

				$stringData = "</ezplorer>";
				fwrite($fxml, $stringData);
				// Close the XML file
				fclose($fxml);
}

$content.="\r\n); \r\n?>";

// Write to File
if( !is_writable(_EXT_PATH."/config/.htusers.php") && !chmod( _EXT_PATH."/config/.htusers.php", 0644 ) ) {
	return false;
}
file_put_contents( _EXT_PATH."/config/.htusers.php", $content);
return true;

}

Share this post


Link to post
Share on other sites
Rechousa

isso já eu vi...

Então viste mal, porque o que implementaste não está de acordo com o que te enviei.

O que te enviei utiliza DOM para construir o XML. O teu código utiliza a construção de strings para constuir o XML.

Como fizeste, pode ser mais rápido para constuir o XML mas não valida se o documento é verdadeira um XML.

o meu código está assim:

Se o teu código está assim e funciona, óptimo. Dá o tópico como resolvido.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
IvanGS

sim o código funciona impeck...

o problmea é que eu não quero que ele me destrua o xml, e que fique só com uma linha.

tenho o código assim:

function save_users() {
$cnt=count($GLOBALS["users"]);
if($cnt>0) sort($GLOBALS["users"]);

// Make PHP-File
$content='<?php 
// ensure this file is being included by a parent file
if( !defined( \'_JEXEC\' ) && !defined( \'_VALID_MOS\' ) ) die( \'Restricted access\' );
$GLOBALS["users"]=array(';
for($i=0;$i<$cnt;++$i) {
	// if($GLOBALS["users"][6]&4==4) $GLOBALS["users"][6]=7;	// If admin, all permissions
	$content.="\r\n\tarray(\"".$GLOBALS["users"][$i][0].'","'.
		$GLOBALS["users"][$i][1].'","'.$GLOBALS["users"][$i][2].'","'.$GLOBALS["users"][$i][3].'",'.
		$GLOBALS["users"][$i][4].',"'.$GLOBALS["users"][$i][5].'",'.$GLOBALS["users"][$i][6].','.$GLOBALS["users"][$i][7].',"'.$GLOBALS["users"][$i][8].'"),';			

		$useremail = $GLOBALS["users"][$i][8];
		$username = "".$GLOBALS["users"][$i][0]."";

		if (file_exists("useremail.xml"))
			{

				$xml = simplexml_load_file("useremail.xml"); // $xml "aponta" para o nó raiz, i.e., <arquivo>
				$xml->user_details->addAttribute('username', $username);
				$xml->user_details_2->addAttribute('email', $useremail);
				$xml->asXML("useremail.xml"); // XML original com o novo elemento				
			}
		else
			{


				$xmlfile="useremail.xml";
				// Open the existing XML file or Open Buffer to the new XML file 
				$fxml = fopen($xmlfile, 'w') or die("".$error3."");
				// Start constucting the XML file 
				//set utf-8 encode
				$stringData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
				fwrite($fxml, $stringData);

				$stringData = "<ezplorer>";
				fwrite($fxml, $stringData);
				//write username
				$stringData = "<user_details username=\"$username\" email=\"$useremail\"/>";
				fwrite($fxml, $stringData);

				$stringData = "</ezplorer>";
				fwrite($fxml, $stringData);
				// Close the XML file
				fclose($fxml);
			}
}

$content.="\r\n); \r\n?>";

// Write to File
if( !is_writable(_EXT_PATH."/config/.htusers.php") && !chmod( _EXT_PATH."/config/.htusers.php", 0644 ) ) {
	return false;
}
file_put_contents( _EXT_PATH."/config/.htusers.php", $content);
return true;

}

e continua a destruir-me o xml

Share this post


Link to post
Share on other sites
Rechousa

Tens isto:

<?xml version="1.0" encoding="utf-8"?>
<ezplorer>
<user_details username="admin" email=""/>
</ezplorer>

Queres isto, certo?

<?xml version="1.0" encoding="utf-8"?>
<ezplorer>
<user_details username="admin" email=""/>
<user_details username="admin2" email="email2"/>
</ezplorer>

Parece-me que tens de executar o método addChild para adicionar um novo elemento, antes de adicionares os respectivos atributos...

Tens aqui um tutorial:

http://www.phpro.org/tutorials/Introduction-To-SimpleXML-With-PHP.html


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
IvanGS

não posso utilizar o DOM porque depois não consigo remover nem adicionar utilizadores.

a única maneira que consegui algum resultado foi assim:

if (file_exists("useremail.xml"))
			{
				$xmlfile="useremail.xml";
				// Open the existing XML file or Open Buffer to the new XML file 
				$fxml = fopen($xmlfile, 'a+');

				//write username
				$stringData = "<user_details username=\"$username\" email=\"$useremail\"/>";
				fwrite($fxml, $stringData);
				fclose($fxml);

			}
		else
			{
				$xmlfile="useremail.xml";
				// Open the existing XML file or Open Buffer to the new XML file 
				$fxml = fopen($xmlfile, 'w');
				// Start constucting the XML file 
				//set utf-8 encode
				$stringData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
				fwrite($fxml, $stringData);

				$stringData = "<ezplorer>";
				fwrite($fxml, $stringData);
				//write username
				$stringData = "<user_details username=\"$username\" email=\"$useremail\"/>";
				fwrite($fxml, $stringData);

				$stringData = "</ezplorer>";
				fwrite($fxml, $stringData);
				// Close the XML file
				fclose($fxml);
			}

o problema é que o XML sai assim:

<?xml version="1.0" encoding="utf-8"?>
<ezplorer><user_details username="teste" email="a@a.a"/>
</ezplorer>
<user_details username="012" email=""/>
<user_details username="admin" email=""/>
<user_details username="012" email=""/>
<user_details username="admin" email=""/>
<user_details username="teste" email="teste@teste.com"/>

mas quero que sai assim:

[/code]

o problema é que o XML sai assim:

<?xml version="1.0" encoding="utf-8"?>
<ezplorer><user_details username="teste" email="a@a.a"/>
<user_details username="teste" email="teste@teste.com"/>
</ezplorer>

alguém me pode ajudar?

Share this post


Link to post
Share on other sites
yoda
<?php

define('DOCROOT', realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR);

ini_set('error_reporting', E_ALL ^ E_NOTICE);

$users = array('test1' => 'test1@domain.com',
                          'test2' => 'test2@domain.com',
                          'test3' => 'test3@domain.com',
		  'test4' => 'test4@domain.com',
		  'test5' => 'test5@domain.com',
		  'test6' => 'test6@domain.com'
);

if (file_exists(DOCROOT.'useremail.xml'))
{	
$ezplorer = new SimpleXMLElement('<ezplorer></ezplorer>');

foreach($users as $name=>$email)
{
	$user_details = $ezplorer->addChild('user_details');
	$user_details->addAttribute('name', $name);
	$user_details->addAttribute('email', $email);
}

$ezplorer->asXML(DOCROOT.'useremail.xml');
exit();                          
}
else
{
echo 'file doesn\'t exist';
}

?>

Share this post


Link to post
Share on other sites
IvanGS

isso já eu tenho...

o que eu quero é que se o ficheiro existir adicione um linha antes de fechar a última tag...

Share this post


Link to post
Share on other sites
IvanGS

neste momento tenho o código assim:

function save_users() {
$cnt=count($GLOBALS["users"]);
if($cnt>0) sort($GLOBALS["users"]);

// Make PHP-File
$content='<?php 
// ensure this file is being included by a parent file
if( !defined( \'_JEXEC\' ) && !defined( \'_VALID_MOS\' ) ) die( \'Restricted access\' );
$GLOBALS["users"]=array(';
for($i=0;$i<$cnt;++$i) {
	// if($GLOBALS["users"][6]&4==4) $GLOBALS["users"][6]=7;	// If admin, all permissions
	$content.="\r\n\tarray(\"".$GLOBALS["users"][$i][0].'","'.
		$GLOBALS["users"][$i][1].'","'.$GLOBALS["users"][$i][2].'","'.$GLOBALS["users"][$i][3].'",'.
		$GLOBALS["users"][$i][4].',"'.$GLOBALS["users"][$i][5].'",'.$GLOBALS["users"][$i][6].','.$GLOBALS["users"][$i][7].',"'.$GLOBALS["users"][$i][8].'"),';			



		$useremail = $GLOBALS["users"][$i][8];
		$username = "".$GLOBALS["users"][$i][0]."";


		if (file_exists("useremail.xml"))
			{
				$myfile = file("useremail.xml");
				$fh = fopen("useremail.xml","w");
				$useremail = stripslashes($useremail);

				for ($index=0; $index < count($myfile); $index++)
				  {
				  if ($useremail != chop($myfile[$index]))
					{fputs($fh,$myfile[$index]);}
				  }
				  
				fputs($fh,"<user_details username=\"$username\" email=\"$useremail\"/>"."\r");
				fclose($fh);
			}
		else
			{
				$xmlfile="useremail.xml";
				// Open the existing XML file or Open Buffer to the new XML file 
				$fxml = fopen($xmlfile, 'w');
				// Start constucting the XML file 
				//set utf-8 encode
				$stringData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
				fwrite($fxml, $stringData);
				$stringData = "<ezplorer>";
				fwrite($fxml, $stringData);
				//write username
				$stringData = "<user_details username=\"$username\" email=\"$useremail\"/>";
				fwrite($fxml, $stringData);
				$stringData = "</ezplorer>";
				fwrite($fxml, $stringData);
				// Close the XML file
				fclose($fxml);
			}	

}


$content.="\r\n); \r\n?>";

// Write to File
if( !is_writable(_EXT_PATH."/config/.htusers.php") && !chmod( _EXT_PATH."/config/.htusers.php", 0644 ) ) {
	return false;
}
file_put_contents( _EXT_PATH."/config/.htusers.php", $content);
return true;

}

e já me insere as linhas no xml.

o problema é que não as está a inserir devidamente

está a ser inserido assim:

<?xml version="1.0" encoding="utf-8"?>
<ezplorer>
<user_details username="q" email="q@qwad.com"/>
</ezplorer>

<user_details username="012" email=""/>
<user_details username="admin" email=""/>
<user_details username="012" email=""/>
<user_details username="adm" email="adm@ezplore.ezteam.com"/>
<user_details username="admin" email=""/>

ou seja, está tamb'em a adicionar os utilizadores que estão registado. cada vez que insiro um novo utilizador ele acrescenta os outros que já estavam inseridos.

e devia estar assim:

<?xml version="1.0" encoding="utf-8"?>
<ezplorer>
<user_details username="q" email="q@qwad.com"/>
<user_details username="adm" email="adm@ezplore.ezteam.com"/>
</ezplorer>

alguém me sabe dizer o porque?

Share this post


Link to post
Share on other sites
ruimcosta

Biba,

Que faz esta linha depois do fecho do elemento?

$stringData = "</ezplorer>";
                                        fwrite($fxml, $stringData);


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
ruimcosta

Tens razão..  lol

if (file_exists("useremail.xml"))
                                {
                                        $myfile = file("useremail.xml");
                                        $fh = fopen("useremail.xml","w");
                                        $useremail = stripslashes($useremail);
                                       
                                        for ($index=0; $index < count($myfile); $index++)
                                          {
                                          if ($useremail != chop($myfile[$index]))
                                                {fputs($fh,$myfile[$index]);}
                                          }
                                         
                                        fputs($fh,"<user_details username=\"$username\" email=\"$useremail\"/>"."\r");
                                        fclose($fh);
                                }
                        else

Dá-me a sensação que estás a adicionar apenas linhas, e como já está lá dentro o "</ezplorer>"; apenas escreves depois. Das duas uma:

Ou reescreves como o yoda sugeriu para poderes manipular as linhas, ou então, sempre que queres adicionar apenas uma linha, tens de eliminar o conteudo e introduzir todas as linhas dos users de novo.


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
Rechousa

Ou reescreves como o yoda sugeriu para poderes manipular as linhas, ou então, sempre que queres adicionar apenas uma linha, tens de eliminar o conteudo e introduzir todas as linhas dos users de novo.

essa última opção é mesmo o que estou a fazer...

Devias fazer como o yoda sugeriu. Essa é que é a forma correcta de trabalhar com XML.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
Rechousa

Compreendo, mas certamente há algo que não estejas a fazer bem.

Recomendo-te que faças um esforço para que consigas usar esse método. Caso estejas muito apertado de tempo, vai pela solução mais rápida.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
IvanGS

que é o meu caso :S

e como eu para criar os utilizadores aparece o genero de uma janela que criei com Ajax, e no fim de criar o utilizador aparece uma mensagem no topo a dizer que foi criado com sucesso... e com aquele script, não sei porque simplesmente não aparece...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.