Ir para conteúdo

POWERED BY:

Arquivado

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

n31m4r

[Resolvido] formulario que grava em base xml

Recommended Posts

estou com problemas em criar os dados no nó principal do arquivo xml para uma base de dados em xml

 

meu form.htm

<table border="0" cellpadding="5" cellspacing="0" width="400">

  <tbody>

    <tr>

      <td bgcolor="#ebebeb">
      <p class="texto"><font color="#0066cc">
      <form method="post" action="gravar.php"><br>

        <font><font color="#0066cc"><br>

username:     <input name="txt_user" type="text"><br>

        <br>

        </font></font><font><font color="#0066cc">senha:
          <input name="txt_senha" type="text"><br>

        <br>

        </font></font><font><font color="#0066cc">Nome:
         <input name="txt_nome" type="text"><br>

        <br>

        </font></font><font><font color="#0066cc">Sobrenome:
 <input name="txt_lastname" type="text"><br>

        <br>

        </font></font><font color="#0066cc"><font><font color="#0066cc"> Email:      
    <input name="txt_email" type="text"><br>

        <br>

        </font></font></font><font color="#0066cc"><font><font color="#0066cc">Fone:      
    <input name="txt_fone" type="text"></font></font></font><br>

        <br>

        <input name="btnOK" value="Gravar Dados" type="submit"><br>

      </form>

 

meu gravar.php

<?php  
//PEGA OS DADOS ENVIADOS PELO FORMULÁRIO  
$user = $_POST["txt_user"]; 
$senha = $_POST["txt_senha"]; 
$nome = $_POST["txt_nome"]; 
$lastname = $_POST["txt_lastname"];  
$email = $_POST["txt_email"]; 
$fone = $_POST["txt_fone"];  
//PREPARA O CONTEÚDO A SER GRAVADO  
$conteudo = "<dataroot><Tabela2> 
<Código>$user</Código> 
<Nome>$senha</Nome> 
<CRC_x002F_PR>$nome</CRC_x002F_PR> 
<Data_x0020_de_x0020_Nascimento>$lastname</Data_x0020_de_x0020_Nascimento> 
<Bolão>$email</Bolão> 
<Canastra>$fone</Canastra> 
</Tabela2></dataroot>";  
//ARQUIVO TXT  
$arquivo = "Tabela2.xml";  
//TENTA ABRIR O ARQUIVO TXT  
if (!$abrir = fopen($arquivo, "a")) { echo "Erro abrindo arquivo ($arquivo)"; exit; }  
//ESCREVE NO ARQUIVO TXT  
if (!fwrite($abrir, $conteudo)) { print "Erro escrevendo no arquivo ($arquivo)"; exit; } echo "Arquivo gravado com Sucesso !!";  
//FECHA O ARQUIVO fclose($abrir);  
?>

 

 

meu tabela2.xml

 

<?xml version="1.0" encoding="UTF-8"?> 
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="Tabela2.xsd" generated="2010-01-22T09:50:46"> 
<Tabela2> 
<Código>9</Código> 
<Nome>jghjhgjg</Nome> 
<CRC_x002F_PR>16484635</CRC_x002F_PR> 
<Data_x0020_de_x0020_Nascimento>2009-02-02T00:00:00</Data_x0020_de_x0020_Nascimento> 
<Bolão>0</Bolão> 
<Canastra>1</Canastra> 
</Tabela2></dataroot><dataroot><Tabela2> 
<Código></Código> 
<Nome></Nome> 
<CRC_x002F_PR></CRC_x002F_PR> 
<Data_x0020_de_x0020_Nascimento></Data_x0020_de_x0020_Nascimento> 
<Bolão></Bolão> 
<Canastra></Canastra> 
</Tabela2></dataroot><dataroot><Tabela2> 
<Código>txt</Código> 
<Nome>txt</Nome> 
<CRC_x002F_PR>txt</CRC_x002F_PR> 
<Data_x0020_de_x0020_Nascimento>txt</Data_x0020_de_x0020_Nascimento> 
<Bolão>txt</Bolão> 
<Canastra>txt</Canastra> 
</Tabela2></dataroot>

como podem ver estou criando outro <dataroot></dataroot> porem isso não era para acontecer era para apagar o ultimo </dataroot> e só escrever no fim, ou seja era para os novos dados ficar no nó principal do <dataroot> e não precisar escrever <dataroot> novamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

pessoal confunde PHP com MySQL e XML com PHP ¬¬

O problema aí ta na parte de PHP não XML.

 

A maneira mais correta seria manipular o "banco de dados" com um XMLParser.

Maaas, já que tá fazendo em fopen, faça da seguinte maneira:

 

-A variável $conteúdo não carregará <dataroot></dataroot>. Comece direto pelo <Tabela2>

-Abra o arquivo xml para leitura+gravação (w+)

-Jogue todo o conteúdo já existente dentro de uma variável $backup

-Aplique uma função de substituição (sugiro preg_replace) na variável $backup e substitua

--"<dataroot>" por ""

--"</dataroot"> por $conteudo

-Grave seu arquivo da seguinte maneira:

--'<dataroot>'.$backup.'</dataroot>';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você errou em muitas coisas, até no fórum escolhido.

Confirmando o que foi dito. Você deveria utilizar um XMLParser para manipulação do xml, um bom exemplo é o SimpleXML.

Nesse caso acontece desse jeito porque o arquivo é criado em base textual não havendo nenhuma interpretação dos comandos xml pelo php, ou seja, isso é puro texto.

E no caso o seu documento xml também está escrito de maneira incorreta, deve observar que o xml possui regras para marcação, que não incluem acentuação e caixa alta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E no caso o seu documento xml também está escrito de maneira incorreta, deve observar que o xml possui regras para marcação, que não incluem acentuação e caixa alta.

 

Cuidado amigo, a única regra que existe no XML quanto a caixa é que o XML é sensível a elas, ou seja, <codigo> é diferente de <Codigo> que é diferente de <CODIGO>.

 

Outro ponto é observar que na 5 edição da especificação do XML contém:

 

 

3.1 Start-Tags, End-Tags, and Empty-Element Tags

[Definition: The beginning of every non-empty XML element is marked by a start-tag.]

 

Start-tag

[40] STag ::= '<' Name (S Attribute)* S? '>' [WFC: Unique Att Spec]

[41] Attribute ::= Name Eq AttValue [você: Attribute Value Type]

 

 

[WFC: No External Entity References]

[WFC: No < in Attribute Values]

 

 

A formação de um Name é

Names and Tokens

[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]

[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]

[5] Name ::= NameStartChar (NameChar)*

[6] Names ::= Name (#x20 Name)*

[7] Nmtoken ::= (NameChar)+

[8] Nmtokens ::= Nmtoken (#x20 Nmtoken)*

 

Se utilizarmos a expressão regular da especificação, veremos que <Código> é sim uma tag válida.

 

Link para a especificação:

Extensible Markup Language (XML) 1.0 (Fifth Edition)

Compartilhar este post


Link para o post
Compartilhar em outros sites

antes de gravar o arquivo txt

<?php
//PEGA OS DADOS ENVIADOS PELO FORMULÁRIO 
$user = $_POST["txt_user"];
$senha = $_POST["txt_senha"];
$nome = $_POST["txt_nome"];
$lastname = $_POST["txt_lastname"]; 
$email = $_POST["txt_email"];
$fone = $_POST["txt_fone"]; 
//PREPARA O CONTEÚDO A SER GRAVADO 
$conteudo = "
<Tabela2>
<user>$user</user>
<senha>$senha</senha>
<nome>$nome</nome>
<sobrenome>$lastname</sobrenome>
<email>$email</email>
<fone>$fone</fone>
</Tabela2>
</dataroot>"; 
//
//ARQUIVO TXT 
$arquivo = "Tabela2.xml"; 
//TENTA ABRIR O ARQUIVO TXT 
if (!$abrir = fopen($arquivo, "a")) { echo "Erro abrindo arquivo ($arquivo)"; exit; } 
//ESCREVE NO ARQUIVO TXT 
if (!fwrite($abrir, $conteudo)) { print "Erro escrevendo no arquivo ($arquivo)"; exit; } echo "Arquivo gravado com Sucesso !!"; 
//FECHA O ARQUIVO fclose($abrir); 
?> 
eu gostaria de apagar a ultima linha a linha: </dataroot>

e apos apagar, executar o codigo escrito acima

Compartilhar este post


Link para o post
Compartilhar em outros sites

n31m4r, seja bem vindo ao fórum. Para uma melhor participação, sugiro que leia o tópico de orientações para uma boa participação. Seus 2 tópicos foram unidos por tratarem do mesmo assunto.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu gostaria de apagar a ultima linha a linha: </dataroot>

 

Amigo, veja só, esse procedimento é totalmente incorreto e só vai lhe trazer problemas, substitua seu código original pelo abaixo que resolverá seu problema:

 

<?php
$user = $_POST["txt_user"]; 
$senha = $_POST["txt_senha"]; 
$nome = $_POST["txt_nome"]; 
$lastname = $_POST["txt_lastname"]; 
$email = $_POST["txt_email"]; 
$fone = $_POST["txt_fone"]; 

$arquivo = "Tabela2.xml";

$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->load( $arquivo );
$dom->formatOutput = true;

$dataroot = $dom->getElementsByTagName( 'dataroot' )->item( 0 );
$dataroot->appendChild( $tabela2 = $dom->createElement( 'Tabela2' ) );
$tabela2->appendChild( $dom->createElement( 'Código' , $user ) );
$tabela2->appendChild( $dom->createElement( 'Nome' , $senha ) );
$tabela2->appendChild( $dom->createElement( 'CRC_x002F_PR' , $nome ) );
$tabela2->appendChild( $dom->createElement( 'Data_x0020_de_x0020_Nascimento' , $lastname ) );
$tabela2->appendChild( $dom->createElement( 'Bolão' , $email ) );
$tabela2->appendChild( $dom->createElement( 'Canastra' , $fone ) );

file_put_contents( $arquivo , $dom->saveXML() );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, veja só, esse procedimento é totalmente incorreto e só vai lhe trazer problemas, substitua seu código original pelo abaixo que resolverá seu problema:

esse é meu garoto,

 

deu certo,

 

caso resolvido

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.