Jump to content

[PHP] Leitura e escrita de ficheiros XML


Recommended Posts

Posted

Há muito tempo atras andei a procura de como ler e escrever em ficheiros XML atraves de PHP e encontrie umas funções, acabando o meu código final por ser o seguinte:

Leitura do XML:

function parseXML2Array($xmlfile, $type = 0) {
$xml = xml_parser_create('ISO-8859-1');

xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0);

$xmldata = file_get_contents($xmlfile);

xml_parse_into_struct($xml, $xmldata, $vals, $index);
xml_parser_free($xml);

foreach ($vals as $node) {
	if ($node['type'] == 'open' && $node['level'] != 1) {
		$arraynode = $node['tag'];
	} elseif ($node['type'] == 'complete' && $node['level'] != 1) {
		if ($node['tag'] == 'id') {
			$id = $node['value'];
		} else {
			switch ($type) {
				case 1	: $xml[$id][$node['tag']] = $node['value'];
						  break;
				case 2	: $xml[$node['tag']] = $node['value'];
						  break;
				default : $xml[$arraynode][$node['tag']] = $node['value'];
						  break;
			}
		}
	}
}
return $xml;
}

Escrita do XML:

function createXMLFile($rootnode, $settarray, $type = 0) {
$xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
$xml .= "<$rootnode>\n";

foreach ($settarray as $node => $nodevalue) {
	if ($type == 1) {
		$id = $node;
		$node = 'item';
	}

	if ($type == 2) {
		$xml .= "\t<$node>$nodevalue</$node>\n";
	} else {
		$xml .= "\t<$node>\n";

		if ($type == 1) {
			$xml .= "\t\t<id>$id</id>\n";
		}

		foreach ($nodevalue as $subnode => $value) {
			$xml.= "\t\t<$subnode>$value</$subnode>\n";
		}

		$xml .= "\t</$node>\n";
	}
}
$xml .= "</$rootnode>";

return $xml;
}

Exemplo de XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<settings>
<nodo1>
	<username>admin</username>
	<password>827ccb0eea8a706c4c34a16891f84e7b</password>
</system>
<system>
	<documentroot>c:/WWW</documentroot>
	<cmsdocumentroot>c:/WWW/devs/nzCms2</cmsdocumentroot>
	<sitename>nzContent Management System v2.0 (ALPHA)</sitename>
	<siteurl>http://localhost/devs/nzCms2</siteurl>
	<messagetimer>2</messagetimer>
</system>
</settings>

Para ler este XML bastava chamar a função do genero:

$_SETTINGS = parseXML2Array('caminho/ficheiro.xml');

O que iria produzir um array do genero:

Array
(
    [login] => Array
        (
            [username] => admin
            [password] => 827ccb0eea8a706c4c34a16891f84e7b
        )

    [system] => Array
        (
            [documentroot] => c:/WWW
            [cmsdocumentroot] => c:/WWW/devs/nzCms2
            [sitename] => nzContent Management System v2.0 (ALPHA)
            [siteurl] => http://localhost/devs/nzCms2
            [messagetimer] => 2
        )

)

Após isto, bastava editar o array como uma variavel normal e depois escrever com a função:

$xmlcontent = createXMLFile('settings', $_SETTINGS);

Seguidamente, era só gravar o conteudo de $xmlcontent para ficheiro.


Como podem reparar em ambas as funções, existe o parametro $type que é para diferentes tipos de ficheiros XML. Apresento a seguir 2 exemplos de XML que representa o $type = 1 e $type = 2 respectivamente. O $type não definido está no exemplo acima.

$type = 1

<?xml version="1.0" encoding="ISO-8859-1"?>
<CATALOG>
<CD>
	<TITLE>Empire Burlesque</TITLE>
	<ARTIST>Bob Dylan</ARTIST>
	<COUNTRY>USA</COUNTRY>
	<COMPANY>Columbia</COMPANY>
	<PRICE>10.90</PRICE>
	<YEAR>1985</YEAR>
</CD>
<CD>
	<TITLE>Hide your heart</TITLE>
	<ARTIST>Bonnie Tyler</ARTIST>
	<COUNTRY>UK</COUNTRY>
	<COMPANY>CBS Records</COMPANY>
	<PRICE>9.90</PRICE>
	<YEAR>1988</YEAR>
</CD>
<CD>
	<TITLE>Greatest Hits</TITLE>
	<ARTIST>Dolly Parton</ARTIST>
	<COUNTRY>USA</COUNTRY>
	<COMPANY>RCA</COMPANY>
	<PRICE>9.90</PRICE>
	<YEAR>1982</YEAR>
</CD>
</CATALOG>

$type = 2

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

Espero que isto seja útil...

Posted

cenas deste tipo, mas mais detalhado e mais bem escrito/estruturado é que fica bem numa wiki do P@P... B)

Posted

não percebi, tas a dizer que não dá para modificar o XML e dps gravar as modificações? é que se for isso tas enganado, volta a ler o post inicial e lê a função createXMLFile()

se não for isso, então n percebi mesmo a que te referias.

Posted

não percebi, tas a dizer que não dá para modificar o XML e dps gravar as modificações? é que se for isso tas enganado, volta a ler o post inicial e lê a função createXMLFile()

se não for isso, então n percebi mesmo a que te referias.

Yep estava a falar de modificar o XML... não tinha reparado na funçao createXMLFile();  B)

Posted

Não sei porque mas nao consegui por a funcionar esse teu codigo, dava-me um erro.. btw ja consegui fazer na mesma o que pretendia em vez de alterar o XML criei um PHP que interpreta como XML, ou seja no flash to a em vez de xamar o xpto.xml estou a xamar o xpto.php que interpreta como XML e dentro desse PHP tou a buscar a informação da base de dados, fica aqui a dica 😛

Posted

mas não percebi... tas com algum prob ou tavas? e se tavas ja conseguiste resolver?

deu a entender que tinhas postado algo e dps editaste mt rapidamente, ou não? ta ai uma confusão 👍

Posted

Eu queria arranjar uma maneira de poder alterar o XML atraves do PHP, ou seja fazer edit do fixeiro .xml atraves de funções no PHP.. Tu deste esse codigo e eu exprimentei, mas dava-me um erro, foi entao que pensei uma nova maneira de solucionar o meu problema que é fazer um PHP que vai buscar informação à base de dados e interpretar o fixeiro como XML e consegui 👍 (mas nao estou a utilizar o teu codigo)

Posted

Eu queria arranjar uma maneira de poder alterar o XML atraves do PHP, ou seja fazer edit do fixeiro .xml atraves de funções no PHP

mas com as funções acima fazias isso facilmente, lias o xml para um array com a função parseXML2Array(), editavas o array como outro array qualquer em php e depois era so voltar a escrever o conteudo no xml usando o createXMLFile()

mas se já resolveste o problema, óptimo.

  • 3 months later...
Posted

De momento uso o 5.1.4, mas já usei outras versões do 5 e funcionava, não me lembro se já tinha testado este código nas versões do 4, mas penso que funcionará... Mas também não custa nada tentar...

Posted

De momento uso o 5.1.4, mas já usei outras versões do 5 e funcionava, não me lembro se já tinha testado este código nas versões do 4, mas penso que funcionará... Mas também não custa nada tentar...

pois, eu tava era na aula de TIC e n podia experimentar o cód 😉 qq puder/precisar testo 🙂

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Posted

mmm....

Não percebi muito bem...

A ideia do xml é usar um parser, passar o xml par a estrutura de dados correspondente, fazer o que há afazer tal qual estamos habituados em qq outra situação e, no fim exportar tudo de novo para xml.

anyway.... estão aí error. XML não pode ter letras maíuculas nas tags

Posted

sinceramente, não estou a perceber qual é a dúvida agora, vocês estão a falar de que? a responder a quem?

Posted

sinceramente, não estou a perceber qual é a dúvida agora, vocês estão a falar de que? a responder a quem?

Ao teu primeiro post se não me engano.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

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.