Jump to content
joaomfs

Escrever num sitio especifico de um ficheiro

Recommended Posts

joaomfs

tenho que fazer uma funcao de le um xml com a descricao de um jogo e essa funcao tem de prodizir uma nova peca a ser jogada, nao sei como vou escrever a nova peca no xml

a parte onde devo escrever e aqui <next tile="B"/>, e caso nao seja possivel gerar mais nenhuma peca fica a tag next vazia <next/>

(mudar o B)

e o resto do xml devera ficar igual

peco desculpa mas estou a escrever com o teclado em ingles e nao sei onde estao certos caracteres

obrigado

Share this post


Link to post
Share on other sites
pwseo

joaomfs,

O mais apropriado seria provavelmente utilizares alguma biblioteca para leitura e manipulação de XML. Para já a tua tarefa é relativamente simples e facilmente exequível com simples leitura de texto e modificação de uma linha, mas no futuro poderás ter necessidades bem mais complexas.

Se não utilizares uma biblioteca para XML, então ficas a saber que habitualmente opta-se sempre por escrever um novo ficheiro por completo. Fazem-se as alterações em memória (se possível) e no final escreve-se o resultado de uma vez para o disco. Vou exemplificar-te o problema de alterar directamente:

Imagina o seguinte ficheiro:

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <next tile="B">
</root>

E agora imagina que queres alterar para a tag vazia <next />:

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

Na realidade, os ficheiros são vistos pelo computador da seguinte forma:

<?xml version="1.0" encoding="UTF-8"?>\n<root>\n  <next tile="B">\n</root>\n
<?xml version="1.0" encoding="UTF-8"?>\n<root>\n  <next />\n</root>\n

Como podes ver, a noção de "nova linha" é representada pelo caracter \n. Se uma determinada linha for encurtada, todas as seguintes terão que ser "arrastadas" para a esquerda, mais perto do início do ficheiro. Podíamos também substituir <next tile="B"> por <next /> de forma a ocupar o espaço original... mas ainda assim isso implicaria aceder ao ficheiro como se fosse um ficheiro binário (que poderíamos manipular byte a byte) e não um ficheiro de texto.

Share this post


Link to post
Share on other sites
joaomfs

Obrigado @pwseo mandei um mail ao cordenador do projeto e ele disse que não era presiso criar um novo ficheiro com o xml mas sim pegar no conteudo do xml antigo e alterar o <next tile=B/> para o tail que geramos e depois imprimir o conteudo modificado na consola, sei que tenho de ler o xml depois procurar pelo Element <next tile=B/> no lugar do B poderá ter um B, N,C ou E e substituir tudo pelo novo que gerou, isso é que não sei como fazer será que podes dar uma ajuda?

o codigo que tenho para passar um xml para element é o seguinte :

-- | Read a XML file to a 'String'.
readXML :: String -> IO String
readXML file = do
               c <- readFile file
               return c

-- | Parse a XML String to an 'Element'.
myParseXML :: String -> Element
myParseXML s = let Just el = parseXMLDoc s
              in el

Peço desculpa por tar a chatear mas sou um pouco noob ;)

Edited by thoga31
Tags code + GeSHi + formatação

Share this post


Link to post
Share on other sites

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.