• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

[PHP]Leitura e escrita de ficheiros XML

33 mensagens neste tópico

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mto nice! tnks nazgulled!!  :smoke:

Tipo... Isso só serve para ler o XML e não para colocar os dados d* input no XML

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :thumbsup: (mas nao estou a utilizar o teu codigo)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Utilizando ou não o código do Nazgulled o que interessa é que esta resolvido :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, eu pelo menos pelo que percebi apresentaste "altas" funções para ler e escrever num XML quando o PHP tem isso tudo feito e basta invocar numa linha :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, eu pelo menos pelo que percebi apresentaste "altas" funções para ler e escrever num XML quando o PHP tem isso tudo feito e basta invocar numa linha :)

As funções SimpleXML foram introduzidas apenas apartir do PHP5 salvo erro.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, mas o PHP5 já saiu à muitos meses......

De qq modo segundo procurei na altura (quando precisei) havia modos mais simples de o fazer no 4.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, mas o PHP5 já saiu à muitos meses......

De qq modo segundo procurei na altura (quando precisei) havia modos mais simples de o fazer no 4.

sim, mas variedade nnc fez mal a nng :)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ya, basicamente era isso que eu estava a dizer... isto pode ser feito com uma biblioteca de XML. O simpleXML vem com o php5 mas acho que pode ser usado com versões anteriores.

Para alem do simplexml já aí vi umas cinco ou seis bibliotecas de xml.

anyway, corrige o tópico de abertura, o xml não pode ter letras maiúsculas dentro das tags

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora que falaram no simplexml eu estou a lembrar-me que na altura em que arranjei este codigo, o php5 ainda não existia, logo precisava de algo para tratar de xml e foi isto que arranjei. Ainda existe por ai muitos webhosts sem suporte para o php5, logo, o simplexml sera inutil e os webhosts que tiverem o 4 é pouco provavel que tenham o simplexml se isso realmente for possivel adaptar a outras versões que não a 5...

Eu apenas coloquei isto aqui numa altura em que houve uma duvida qualquer que alguem queria usar xml com php, eu tinha estas funções aqui, são faceis e praticas de as usar, então disponibilizei-as apenas isso...

Só não percebi os primeiros posts do pedortuga, porque ninguem estava com duvidas algumas e andaste a induzir que havia erros, ora, erros no codigo não são porque eu uso e funciona mt bem, as tais maiúsculas dentro das tags, tens razão, mas aquilo foram exemplos que saquei de outros sites pois na altura não me tava a apetecer inventar os meus, apenas copiei e colei...

E sinceramente não vejo qual a dificuldade de usar estas funções e se existem formas mais simples não tou a ver quais... isto parece-me do mais simples que ha, mas tambem pode depender um pouco do uso que cada um quer dar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora