Ir para conteúdo

POWERED BY:

Arquivado

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

Freelife

Inserir node em xml

Recommended Posts

Boa tarde.

 

Seguinte, preciso inserir um node dentro do nó pai do xml.

 

estou usando o seguinte código.

 

Porém não dá certo, pq essas tags tem que ficar dentro da tag pai: <c>content</c>.

 

Alguém sabe como fazer?

function post(){
$nome = $_REQUEST["name"];
$text = $_REQUEST["texto"];

$xml = "<msg>";
$xml .= "<name>$nome</name>";
$xml .= "<texto>$text	</texto>";
$xml .="</msg>\n";


	//gerar o xml e atualizar os dados na página.	
	$file = 'chat.xml';
	if(file_exists($file)){		
		//$cria = fopen($file, "a");
		// Tudo para o proprietario, leitura e execucao para os outros
					chmod ($file, 0755);
						//$conteudo = "<pre>$menu_xml</pre>";
						if (!$file = fopen($file, 'a')) {
					         echo "Não foi possível abrir o arquivo ($file)";
					         exit;
					    }
					  	if (fwrite($file, $xml) === FALSE) {
					        echo "Não foi possível escrever no arquivo ($file)";
					        exit;
					    }
					    echo "Sucesso: Escrito ($nome) no arquivo ($file)";
		fclose($file);
	}
	else{
		echo "O arquivo não existe";
		exit;
	}
}
Att.

Freelife

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou verficiar esses links, porém tenho o manual do php aqui no pc, e pelo menos na parte de DOM não achei nenhum ítem que me permitisse inserir um nó no meio do arquivo, para isso, só reescrevendo-o.

 

Enquanto isso se alguém tiver outra sugestão...

 

Abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

num formato de chat assim:

 

<c>
   <msg>
       <nome>Nome</nome>
       <texto>texto</texto>
   </msg>
   <msg>
       <nome>Nome</nome>
       <texto>texto</texto>
   </msg>
   <msg>
       <nome>Nome</nome>
       <texto>texto</texto>
   </msg>
</c>

 

Aí você provavelmente deve estar querendo adicionar um novo nó:

$nova_msg = $document->createElement('msg');
$novo_nome = $document->createElement('nome',$nome);
$novo_texto = $document->createElement('texto',$texto);

$nova_msg->appendChild($novo_nome);
$nova_msg->appendChild($novo_texto);

$document->appendChild($nova_msg);

 

Feito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelas respostas.

 

Eu já havia tentado fazer isso, mas não tinha dado certo. Estava fazendo assim:

 

$name = $doc -> createElement("name");

$name = $msg -> appendChild($name);

 

$texto = $doc -> createElement("texto");

$texto = $msg -> appendChild($texto);

 

Agora eu modifiquei o arquivo e fiz assim:

 

$doc = new DomDocument;
$doc -> formatOutput = true;
// We need to validate our document before refering to the id
$doc->validateOnParse = true;
$doc->Load('chat2.xml');

$doc -> getElementsById('pai');
//echo $chat;
$nome = "Jean";
$texto = "Aqui vai o texto da nova msg";

$nova_msg = $doc -> createElement("msg");
$novo_nome = $doc -> createElement("name",$nome);
$novo_texto = $doc -> createElement("texto", $texto);

$nova_msg -> appendChild($novo_nome);
$nova_msg -> appendChild($novo_texto);

$doc -> appendChild($nova_msg);
echo $doc->saveXML();
$doc -> save("chat3.xml");

e deu quase certo.

 

Como é que faço para inserir o nó dentro da tag principal?

no xml ficou assim:

 

//esse foi o código gerado agora. Só olhar, tá faltando a tag root.
<msg>
  <name>Jean</name>
  <texto>Aqui vai o texto da nova msg</texto>
</msg>
<msg>
  <name>Jean</name>
  <texto>Aqui vai o texto da nova msg</texto>
</msg>


Tem como corrigir isso?

 

De novo, obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem como corrigir isso?

 

Uma implementação orientada a objetos ficaria assim:

 

IChat.php

<?php
/**
* Interface para criação de um objeto de chat que conterá várias mensagens
*/
interface IChat extends Countable, IteratorAggregate {
/**
 * Adiciona uma nova mensagem ao chat
 * @param IChatMessage $message A mensagem que será adicionada
 */
public function addMessage( IChatMessage $message );

/**
 * Salva o chat
 */
public function save();

/**
 * Define a classe que será utilizada para criar o objeto Iterator
 * @param string $class O nome da classe que implementa a interface Iterator
 * @see IteratorAggregate::getIterator()
 */
public function setMessageIteratorClass( $class );
}

 

IChatMessage.php

<?php
/**
* Interface para criação de objetos de mensagem
*/
interface IChatMessage {
/**
 * Recupera o nome do autor da mensagem
 * @return string
 */
public function getName();

/**
 * Recupera o texto da mensagem
 * @return string
 */
public function getText();
}

 

IChatMessageFactory.php

<?php
/**
* Interface para criação de objetos que fabricam objetos e elementos
* relacionados com as mensagens
*/
interface IChatMessageFactory {
/**
 * Cria uma mensagem do chat
 * @param string $name O autor da mensagem
 * @param string $text O texto da mensagem
 * @return IChatMessage
 */
public function createChatMessage( $name , $text );
}

 

AbstractChat.php

<?php
/**
* Base para implementação da interface IChat
*/
abstract class AbstractChat implements IChat {
/**
 * @var boolean
 */
private $changed;

/**
 * @var ChatMessageFactory
 */
protected $factory;

/**
 * @var ArrayObject
 */
protected $messages;

/**
 * Constroi o objeto do chat
 * @param IChatMessageFactory $messageFactory Fábrica de mensagens
 * @throws RuntimeException Se o arquivo não existir ou não tiver permissões de leitura
 */
public function __construct( IChatMessageFactory $messageFactory ){
	$this->factory = $messageFactory;
	$this->messages = new ArrayObject();

	$this->clearChanged();
	$this->getMessages();
}

/**
 * Destroi o objeto e grava as modificações no arquivo
 */
public function __destruct(){
	if ( $this->isChanged() ){
		$this->save();
	}
}

/**
 * Adiciona uma nova mensagem
 * @param IChatMessage $message
 * @throws RuntimeException Se algum erro ocorrer ao adicionar o nó ao XML
 */
public function addMessage( IChatMessage $message ){
	$this->messages->append( $message );
	$this->setChanged();
}

/**
 * Limpa a definição de modificado do objeto
 */
protected function clearChanged(){
	$this->changed = false;
}

/**
 * Recupera o total de mensagens
 * @return integer
 */
public function count(){
	return $this->messages->count();
}

/**
 * Recupera um Iterator para as mensagens
 * @return Iterator
 */
public function getIterator(){
	return $this->messages->getIterator();
}

/**
 * Recupera as mensagens na abertura do arquivo
 */
abstract protected function getMessages();

/**
 * Verifica se o objeto foi modificado
 * @return boolean
 */
public function isChanged(){
	return $this->changed;
}

/**
 * Define que o objeto foi modificado
 */
protected function setChanged(){
	$this->changed = true;
}

/**
 * Define o Iterator que será retornado pelo método getIterator
 * @param string $class O nome da classe que implementa a interface Iterator
 */
public function setMessageIteratorClass( $class ){
	$this->messages->setIteratorClass( $class );
}
}

 

ChatMessage.php

<?php
/**
* Uma mensagem do chat
*/
class ChatMessage implements IChatMessage {
/**
 * Autor da mensagem
 * @var string
 */
private $name;

/**
 * Texto da mensagem
 * @var string
 */
private $text;

/**
 * Constroi uma nova mensagem
 * @param string $name Autor da mensagem
 * @param string $text Texto da mensagem
 */
public function __construct( $name , $text ){
	$this->name = $name;
	$this->text = $text;
}

/**
 * Recupera o nome do autor da mensagem
 * @return string
 */
public function getName(){
	return $this->name;
}

/**
 * Recupera o texto da mensagem
 * @return string
 */
public function getText(){
	return $this->text;
}
}

 

ChatMessageFactory.php

<?php
/**
* Fábrica de objetos relacionados com mensagens
*/
class ChatMessageFactory implements IChatMessageFactory {
/**
 * Cria uma nova mensagem
 * @param string $name Autor da mensagem
 * @param string $text Texto da mensagem
 */
public function createChatMessage( $name , $text ){
	return new ChatMessage( $name , $text );
}
}

 

Ok, com a base do chat criada, vamos agora pensar na implementação baseada em DOM:

 

IDOMChat.php

<?php
/**
* Interface para criação de um objeto de chat baseado em DOM
*/
interface IDOMChat extends IChat {
/**
 * Recupera o objeto DOM
 * @return DOMDocument
 */
public function getDOM();
}

 

IDOMChatMessageFactory.php

<?php
interface IDOMChatMessageFactory extends IChatMessageFactory {
/**
 * Cria um DOMElement baseado em uma mensagem
 * @param IChatMessage $message A mensagem
 * @param DOMDocument $dom Objeto DOM que será utilizado para criação da mensagem
 * @return DOMElement
 */
public function createElementFromChatMessage( IChatMessage $message , IDOMChat $domChat );

/**
 * Cria uma nova mensagem baseada em uma lista de nós do XML
 * @param DOMNodeList $childs
 * @return IChatMessage
 */
public function createFromDOMNodeList( DOMNodeList $childs );
}

 

DOMChat.php

<?php
/**
* Implementação do chat usando DOM
*/
class DOMChat extends AbstractChat implements IDOMChat {
/**
 * @var DOMDocument
 */
private $dom;

/**
 * @var string
 */
private $file;

/**
 * @var boolean
 */
private $writable;

/**
 * Constroi o objeto do chat
 * @param string $file Nome do arquivo XML que contém o histórico
 * @param IDOMChatMessageFactory $messageFactory Fábrica de mensagens
 * @throws RuntimeException Se o arquivo não existir ou não tiver permissões de leitura
 */
public function __construct( $file , IDOMChatMessageFactory $messageFactory ){
	if ( is_file( $file ) && is_readable( $file ) ){
		$this->dom = new DOMDocument();
		$this->dom->load( $file );
		$this->file = $file;
		$this->writable = is_writable( $file );

		parent::__construct( $messageFactory );
	} else {
		throw new RuntimeException( sprintf( 'O arquivo %s não existe ou não temos permissões de leitura.' , $file ) );
	}
}

/**
 * Adiciona uma nova mensagem
 * @param IChatMessage $message
 * @throws RuntimeException Se algum erro ocorrer ao adicionar o nó ao XML
 */
public function addMessage( IChatMessage $message ){
	try {
		$this->dom->firstChild->appendChild( $this->factory->createElementFromChatMessage( $message , $this ) );
		parent::addMessage( $message );
	} catch( DOMException $e ){
		throw new RuntimeException( $e->getMessage() , $e->getCode() , $e );
	}
}

/**
 * Recupera o objeto DOM
 * @return DOMDocument
 */
public function getDOM(){
	return $this->dom;
}

/**
 * Recupera as mensagens na abertura do arquivo
 */
protected function getMessages(){
	foreach ( $this->dom->firstChild->getElementsByTagName( 'msg' ) as $node ){
		$this->messages->append( $this->factory->createFromDOMNodeList( $node->childNodes ) );
	}
}

/**
 * Salva em disco
 * @return boolean
 * @throws RuntimeException Se não tivermos permissões de gravação
 */
public function save(){
	$ret = false;

	if ( $this->writable ){
		$ret = $this->dom->save( $this->file ) !== false;
		$this->clearChanged();
	} else {
		throw new RuntimeException( 'Não temos permissões de gravação.' );
	}

	return $ret;
}
}

 

DOMChatMessageFactory.php

<?php
/**
* Fábrica de mensagens de uma implementação baseada em DOM
*/
class DOMChatMessageFactory extends ChatMessageFactory implements IDOMChatMessageFactory {
/**
 * Cria uma mensage com o conteúdo de um DOMNodeList
 * @param DOMNodeList $childs Lista de nós do XML
 * @return ChatMessage
 * @throws UnexpectedValueException Se a lista não contiver o número de nós esperados
 * @uses ChatMessage
 */
public function createFromDOMNodeList( DOMNodeList $childs ){
	if ( $childs->length == 2 ){
		$name = $childs->item( 0 )->nodeValue;
		$text = $childs->item( 1 )->nodeValue;

		return $this->createChatMessage( $name , $text );
	} else {
		throw new UnexpectedValueException( 'Lista de nós inesperada.' );
	}
}

/**
 * Cria um elemento para a mensagem
 * @param IDOMChat $domChat
 * @return DOMElement
 * @throws RuntimeException se não for possível criar o elemento
 */
public function createElementFromChatMessage( IChatMessage $message , IDOMChat $domChat ){
	try {
		$dom = $domChat->getDOM();

		$element = $dom->createElement( 'msg' );
		$element->appendChild( $dom->createElement( 'name' , $message->getName() ) );
		$element->appendChild( $dom->createElement( 'text' , $message->getText() ) );

		return $element;
	} catch ( DOMException $e ){
		throw new RuntimeException( $e->getMessage() , $e->getCode() , $e );
	}
}
}

 

Ok, agora, o XML vazio, que será base disso ai:

arquivo.xml

<?xml version="1.0" encoding="UTF-8"?>
<c />

 

Certo, usando tudo isso:

<?php
$factory = new DOMChatMessageFactory();
$chat = new DOMChat( 'arquivo.xml' , $factory );
$chat->addMessage( $factory->createChatMessage( 'João' , 'Primeira mensagem' ) );
$chat->addMessage( $factory->createChatMessage( 'Neto' , 'Segunda mensagem' ) );
$chat->save();

 

Após isso, nosso XML ficou:

<?xml version="1.0" encoding="UTF-8"?>
<c>
<msg>
	<name>João</name>
	<text>Primeira mensagem</text>
</msg>
<msg>
	<name>Neto</name>
	<text>Segunda mensagem</text>
</msg>
</c>

 

Agora, apenas lendo as mensagens do arquivo:

<?php
$chat = new DOMChat( '../arquivo.xml' , new DOMChatMessageFactory() );

foreach ( $chat as $message ){
echo $message->getName() , ' disse: ' , $message->getText() , PHP_EOL;
}

 

A saída:

João disse: Primeira mensagem

Neto disse: Segunda mensagem

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só para ficar mais claro...

 

era para ter ficado assim:

 

<chat>//tag principal
<msg> 
  <name>Jean</name>
  <texto>Aqui vai o texto da nova msg</texto>
</msg>
<msg>
  <name>Jean</name>
  <texto>Aqui vai o texto da nova msg</texto>
</msg>
<chat>

Só que quando a nova tag <msg> é criada, ela fica fora da tag principal, isso faz com que o xml fique errado.

 

Abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

Freelife, perceba que o Sistema postado pelo João faz tudo o que precisa, adicionando as tags no local correto, deixando tudo pronto para utlização com sua implementação JavaScript (acredito eu).

 

A ÚNICA diferença é o nome da root-tag que ao invés de chat ficou como c, mas, pelo que pude ver, basta que você renomeie essa tag para o que deseja no arquivo.xml usado como base para um novo chat.

 

No mais, João, sem palavras http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda!

 

Eu realemente tenho dificuldades em entender isso, mas vou estudar esse código postado pelo João e ver o que consigo fazer. Quero realmente entender o que ele faz, então... tenho bastante coisa para estudar.

 

Obrigado João e a todos que responderam.

 

Quando conseguir fazer algo aqui, eu posto.

 

Att.

Freelife

 

Bom dia galera...

 

Caraca... eu dei uma olhada melhor no código... é bem complicado para mim.

Achei que fosse uma coisa simples inserir um dado no meio do xml... mas realmente... vou ter que estudar muito mais.

 

Valeu João.

 

1ª pergunta: você criou isso quando viu o tópico ou já tinha o código pronto?

 

Att.

Freelife

Compartilhar este post


Link para o post
Compartilhar em outros sites

1ª pergunta: você criou isso quando viu o tópico ou já tinha o código pronto?

 

Ele já tinha tudo armazenado na Área de Wernicke e só precisou redigir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele já tinha tudo armazenado na Área de Wernicke e só precisou redigir.

 

kkkkkkk, chorei de rir agora.

 

Mas @Freelife, apesar da brincadeira, o @Evandro Oliveira respondeu com precisão sua pergunta, sim, eu escrevi o código acima quando li sua dúvida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

1ª pergunta: você criou isso quando viu o tópico ou já tinha o código pronto?

 

Ele já tinha tudo armazenado na Área de Wernicke e só precisou redigir.

 

Não acredito que eu realmente abri o Google pra descobrir o que é isso. :lol:

 

Mas, Freelife, se o código é avançado, procura a acompanhar o Curso de OOP que o João está postando um capítulo de cada vez na áreade Cursos PHP http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

pois é... logo que lí fiquei pensando me procurar.. .ainda bem que não fui... rsrsrs :)

Brincadeiras sem graça à parte....

 

Então sobre o curso de OOP, não sabia que estavam desenvolvendo. Vou ler sim.

 

Mas estou aqui agora quebrando minha cabeça para entender o código. João, então.. você é o cara!

 

 

Valeu galera..

 

Assim que conseguir, volto a postar.

 

Att.

Freelife

 

Galera...

 

Estou tendo problemas agora com os acentos.

 

Será que alguém pode ajudar...

 

Exemplo:

<msg>
	<name>Freelife</name>
	<texto>Olá</texto>
</msg>
Porém ocorre esse erro:

Warning: DOMDocument::saveXML() [domdocument.savexml]: Validation failed: no DTD found !output conversion failed due to conv error, bytes 0xE1 0x5D 0x5D 0x26 in C:\WS\www\gadget\insert.php on line 33

 

Freelife<![CDATA[Ol

 

Nesse ponto dá para ver que o xml parou na letra com acento...

tem como corrigir isso?

 

Att.

Freelife

 

Fala galera...

 

consegui resolver com utf8_encode...

 

 

Muito 10...

 

Quando conseguir terminar eu posto aqui...

 

 

Vlw

 

Abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite...

 

Bom, achei que tivesse resolvido a questão do acento, mas não deu não.

 

Mesmo usando o utf8_encode ou utf8_decode não dá certo. Sempre dá erro quando vou gravar os dados no xml.

 

Warning: DOMDocument::save() [domdocument.save]: Validation failed: no DTD found !output conversion failed due to conv error, bytes 0xEA 0x3F 0x5D 0x5D in on line 36

 

na linha 36 tem isso:

$doc -> save("chat2.xml");

E aí... o que eu faço?

 

Att.

Freelife

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.