FBI Posted April 28, 2012 at 10:34 PM Report #451979 Posted April 28, 2012 at 10:34 PM Boa noite, estou a fazer um programa em linguagem C, que lê um ficheiro XML, e armazena umas certas informações num vector de estruturas. Não estou a usar nenhuma biblioteca para efectuar o parsing, estou mesmo a fazê-lo à mão. Como tal, quando leio uma linha do género: <title>Meu titulo</title> como faço para eliminar os tags <title> e </title> da string que vou armazenar no vector de estruturas. Já tentei utilizar a função strtok, e não estou a conseguir chegar ao resultado pretendido, alguém me consegue ajudar?
petvetbr Posted April 28, 2012 at 10:42 PM Report #451985 Posted April 28, 2012 at 10:42 PM Eu não sei de fazer o parsing de XML na mão em C é uma boa idéia. Já ouvi histórias de terror de pessoas que tentaram fazer o mesmo. Em outras linguagens, isto pode ser mais fácil usando recursos como expressões regulares (REGEX), e rotinas de manipulação de strings, mas em C, isto pode ser muito complicado de fazer corretamente. Fernando Lage Bastos - MCP/MCTS/MCPD
FBI Posted April 28, 2012 at 10:56 PM Author Report #451988 Posted April 28, 2012 at 10:56 PM Sim, mas não posso fazer noutras linguagens, a ideia é mesmo fazê-lo em C. Eu tenho a perfeita noção de que esse parsing é mais fácil de fazer quer seja em Java, quer seja utilizando C#, contudo o C é a minha unica opção para este programa. E esqueci-me de mencionar uma coisa, o ficheiro é sempre estruturado da mesma forma, ou seja, não é sempre o mesmo, mas as alterações ao ficheiro XML são todas controladas e facilmente programadas, logo a leitura do ficheiro XML no meu caso, pode ser feita utilizando simples condições de leitura e comparação de strings, contudo, é o que eu estava a dizer, estou a ter problemas numa função para cortar strings, retirar-lhe partes... Mas agradeço a tua resposta petvetbr. 😄
HappyHippyHippo Posted April 28, 2012 at 11:04 PM Report #451989 Posted April 28, 2012 at 11:04 PM isso é complicado .... tenta ver como outras bibliotecas o fazem para teres uma ideia como se faz exemplo é o php : http://www.php.net/manual/en/book.xml.php IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
KTachyon Posted April 28, 2012 at 11:04 PM Report #451990 Posted April 28, 2012 at 11:04 PM A ideia seria procurares as posições consecutivas de caracteres '<' e '>' e registares o nome que se encontra dentro (neste caso o 'title') numa stack, removendo-o da stack quando encontras a tag de fecho (ou seja, '/title'). “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
petvetbr Posted April 28, 2012 at 11:10 PM Report #451991 Posted April 28, 2012 at 11:10 PM Aqui tem um exemplo, mas utiliza o parser da Microsoft http://www.codeproject.com/Articles/176236/Parsing-an-XML-file-in-a-C-C-program Fernando Lage Bastos - MCP/MCTS/MCPD
FBI Posted April 28, 2012 at 11:22 PM Author Report #451993 Posted April 28, 2012 at 11:22 PM Muito obrigado a todos, peço desculpa mais uma vez, aproveito para adicionar mais uma informação, que não me pareceu relevante dado a pergunta que coloquei, o programa é em Linux, e não em Windows... Logo a biblioteca de parsing da microsoft também não poderei utilizar. 😄 Quanto à opção que me deste KTachyon, já tinha pensado nisso, mas isso não se tornaria pesado? Não me interessava também que o programa se tornasse lento, daí estar a tentar ao máximo usar as funções e bibliotecas já criadas para manipulação de strings, uma vez que já estão(penso eu) optimizadas...
pmg Posted April 28, 2012 at 11:31 PM Report #451994 Posted April 28, 2012 at 11:31 PM A funcao strstr() acha a primeira string dentro doutra string. Depois de achares, por exemplo, <title> podes pesquisar </title> e teres a certeza que achaste o correspondente, desde que nao possa haver tags dentro de tags iguais. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
KTachyon Posted April 28, 2012 at 11:34 PM Report #451995 Posted April 28, 2012 at 11:34 PM Muitas das coisas que tu imaginas optimizadas, não estão exactamente optimizadas. De facto, muitas das funções existentes nas bibliotecas de C foram desenvolvidas para resolverem problemas genéricos e muitas vezes fazem uma utilização de recursos bastante superiores de forma a prevenir situações em casos genéricos que podem não existir em casos específicos. Essas funções não estão mais optimizadas que a função mais optimizada que possa ser implementada para o teu caso específico. No máximo estarão tão optimizadas como a solução mais optimizada. De qualquer forma, fazeres a procura pelas ocorrências sucessivas de '<' e '>' é uma coisa relativamente simples que consiste em verificar se existe um determinado caracter em posições sucessivas. A não ser que saibas sempre quais são as tags que aparecem nos ficheiros e que nunca aparecem ficheiros inválidos, penso que a melhor solução seria mesmo teres uma stack que te permitisse manter o controlo sobre a árvore do XML. “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
FBI Posted April 28, 2012 at 11:52 PM Author Report #451997 Posted April 28, 2012 at 11:52 PM Obrigado a todos pela ajuda, obrigado pelo esclarecimento da optimização KTachyon, de facto não ponderei os possiveis casos especificos que poderão existir dentro das funções das bibliotecas de C. O problema já foi resolvido, em parte graças a ti KTachyon, comecei a pensar nas caracteristicas da função strtok() e consegui chegar a uma conclusão, o objectivo da função, é "cortar" a string dando-lhe uma sub-string que contém o critério de "corte"... "Corte" porque na realidade o que ela faz é divisão da string em tokens. "Cortando" a string, primeiro no caracter : ">", ficamos com a string : "My title</title>", que se "cortarmos" de novo, mas desta vez com critério "<", ficamos com "My title" que era exactamente o pretendido... Obrigad a todos os que tentaram ajudar... 😄 Abraço
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now