Freelife 2 Denunciar post Postado Maio 21, 2010 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
Evandro Oliveira 331 Denunciar post Postado Maio 21, 2010 Que tal se você manipulasse XML com os recursos apropriados para isto? Compartilhar este post Link para o post Compartilhar em outros sites
Freelife 2 Denunciar post Postado Maio 21, 2010 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
lucaswxp 22 Denunciar post Postado Maio 21, 2010 Será mais facil utilizar os recursos que Evandro citou. Alguns links: http://imasters.com.br/artigo/1468/xml/iniciando_em_php_com_xml/ http://www.google.com.br/search?hl=pt-BR&safe=off&client=firefox-a&hs=TZa&rls=org.mozilla%3Apt-BR%3Aofficial&q=xml+com+php&aq=f&aqi=&aql=&oq=&gs_rfai= Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Maio 21, 2010 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
Freelife 2 Denunciar post Postado Maio 21, 2010 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
João Batista Neto 448 Denunciar post Postado Maio 22, 2010 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
Freelife 2 Denunciar post Postado Maio 22, 2010 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
Bruno Augusto 417 Denunciar post Postado Maio 22, 2010 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
Freelife 2 Denunciar post Postado Maio 24, 2010 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
Evandro Oliveira 331 Denunciar post Postado Maio 24, 2010 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
João Batista Neto 448 Denunciar post Postado Maio 24, 2010 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
Bruno Augusto 417 Denunciar post Postado Maio 24, 2010 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
Freelife 2 Denunciar post Postado Maio 24, 2010 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
Freelife 2 Denunciar post Postado Maio 25, 2010 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