Ler de XML em C

X3minater

Power Member
Boas

Alguém sabe como se faz para ler cenas do ficheiro XML???
Arranjei este pedaço de código, mas não o consigo preceber:

while (fgets(s, 90, fp)!=NULL)
{

if (strstr(s, wrd)!=NULL)
{
fgets(s,90,fp)
s1=strch(s,'>')
sscanf(s1,"%d",&s[count].codigo)

fgets(s,90,fp)
s1=strch(s,'>')
sscanf(s1,"%d",&s[count].num_acessos)

fgets(s,90,fp)
s1=strch(s,'>')
sscanf(s1,"%d",&s[11].data)
}
count++;
}

E depois como é que eu chamo essa função na main? "...leitura(...)"
 
O problema é esse! Isso faz parte dum trabalho da Universidade e n posso usar processadores de XML (que também não sei o que é...).

Se alguém souber fazer isso apenas usando código básico agradecia que respondessem!

Fikem bem! ;)
 
/*Enquanto houver ficheiro, lês para s 90 caracteres*/
while (fgets(s, 90, fp)!=NULL)
{
/*Procura pelo que está guardado em wrd dentro de str, creio q deve ser específico de algum XML*/
if (strstr(s, wrd)!=NULL)
{
/*Volta a ler 90 caracteres do ficheiro para s*/
fgets(s,90,fp)
/*Procura pelo caracter > na string*/
s1=strch(s,'>')
/*Encontrado o caracter >, vai ler o decimal que está a seguir*/
sscanf(s1,"%d",&s[count].codigo)

fgets(s,90,fp)
s1=strch(s,'>')
sscanf(s1,"%d",&s[count].num_acessos)

fgets(s,90,fp)
s1=strch(s,'>')
sscanf(s1,"%d",&s[11].data)
}
count++;
}

E depois como é que eu chamo essa função na main? "...leitura(...)"

Eu quando trabalhei com XML sabia à priori o formato do ficheiro e por isso fazia uma leitura "normal" tendo em consideração a estrutura do mesmo, usando strch e tal.

Depois de criares a função chamas no main como outra qualquer função....

Ps: O código tem comentários.
 
Ola

Estou com o mesmo problema :sad: como consigo ler em C deste ficheiro .xml:

<pos>
<empresa>Empresa X</empresa>
<fornecedores>
<fornecedor>
<id>1</id>
<nome>BlaBla Lda.</nome>
<cont>501031034</cont>
</fornecedor>
<fornecedor>
<id>2</id>
<nome>EuroMilhoes S.A.</nome>
<cont>505036190</cont>
</fornecedor>
</fornecedores>
</pos>

Queria ler o conteudo deste ficheiro para estruturas, mas nao estou a conseguir!
Alguem consegue ajudar-me?
 
Última edição:
Ola

Estou com o mesmo problema :sad: como consigo ler em C deste ficheiro .xml:

<pos>
<empresa>Empresa X</empresa>
<fornecedores>
<fornecedor>
<id>1</id>
<nome>BlaBla Lda.</nome>
<cont>501031034</cont>
</fornecedor>
<fornecedor>
<id>2</id>
<nome>EuroMilhoes S.A.</nome>
<cont>505036190</cont>
</fornecedor>
</fornecedores>
</pos>

Queria ler o conteudo deste ficheiro para estruturas, mas nao estou a conseguir!
Alguem consegue ajudar-me?


regex ...

para apanhar o que está entre as tags usa uma expressão como :

<cont>(.*?)<\/cont> --> devolveria 501031034 e505036190

se queres controlar todas as informações que estão entre <fornecedor> e </fornecedor>, é fazer um ciclo que começa quando um fgets apanhar uma string "<fornecedor>" e acaba quando apanhar um "</fornecedor>".

pelo meio é ler tudo usando a expressão que deixei em cima.

PS: Não enviei PMs... não faço trabalhos :p
 
Se queres aceder aos dados definidos por uma linguagem de estruturação de dados então precisas dum analisador sintáctico da linguagem. Se queres fazer um analisador sintáctico da linguagem então precisas de fazer pelo menos uma máquina de estados. Neste caso, com certeza que não te pedem para implementar todas as especificações de XML (nem pedem atributos), o que simplifica a coisa.
 
Se queres aceder aos dados definidos por uma linguagem de estruturação de dados então precisas dum analisador sintáctico da linguagem. Se queres fazer um analisador sintáctico da linguagem então precisas de fazer pelo menos uma máquina de estados. Neste caso, com certeza que não te pedem para implementar todas as especificações de XML (nem pedem atributos), o que simplifica a coisa.

calma lá pk isto é para o 1ºano de electro
 
regex ...

para apanhar o que está entre as tags usa uma expressão como :

<cont>(.*?)<\/cont> --> devolveria 501031034 e505036190

se queres controlar todas as informações que estão entre <fornecedor> e </fornecedor>, é fazer um ciclo que começa quando um fgets apanhar uma string "<fornecedor>" e acaba quando apanhar um "</fornecedor>".

pelo meio é ler tudo usando a expressão que deixei em cima.

PS: Não enviei PMs... não faço trabalhos :p

Eu tou a fazer fgets() para ler uma linha do ficheiro e depois strstr() para encontrar uma subtring dentro da linha.
Mas o k acontece é k quando faço o fgets k detecta <cont> na string, o proximo fgets k eu fizer ja vai estar na linha seguinte :sad:

K poxo fazer?
 
Eu tou a fazer fgets() para ler uma linha do ficheiro e depois strstr() para encontrar uma subtring dentro da linha.
Mas o k acontece é k quando faço o fgets k detecta <cont> na string, o proximo fgets k eu fizer ja vai estar na linha seguinte :sad:

K poxo fazer?



regex nessa linha para apanhares o que queres ou de uma maneira mais martelada, apanhar tudo o que esteja entre o primeiro ">" e o segundo ">" (strstr para os localizar e strpos para ler fazem isto).
 
Ola

Estou com o mesmo problema :sad: como consigo ler em C deste ficheiro .xml:

<pos>
<empresa>Empresa X</empresa>
<fornecedores>
<fornecedor>
<id>1</id>
<nome>BlaBla Lda.</nome>
<cont>501031034</cont>
</fornecedor>
<fornecedor>
<id>2</id>
<nome>EuroMilhoes S.A.</nome>
<cont>505036190</cont>
</fornecedor>
</fornecedores>
</pos>

Queria ler o conteudo deste ficheiro para estruturas, mas nao estou a conseguir!
Alguem consegue ajudar-me?

Epá lol. Por acaso não andas em aero@IST. É que eu ando e em programação o projecto final usa um xml igualzinho a esse.

Não vou obviamente disponibilizar o meu codigo, mas deixo-te uns conselhos.(partindo do principio que o xml não tem erros.

Usa o fgets para sacar uma linha e depois usa o strstr para podere saber a informação contida em cada linha. Quando encontrar</fornecedor> alocas memoria para um novo elemento da lista de fornecedores.
Depois, podes fazer um sscanf para sacar a informação util entre as tags e meter nesse novo elemento ou entao, a minha preferida, fazer uma função para eliminar as tags e depois se for preciso usas atoi para converter para int ou aotf se for para float.
Depois, como deves tar a usar listas dinamicas, fazer um função para inserir cada novo fornecedor à lista (essa função de inserir deve receber o endereço da base da lista e o endereço do novo elemento).

PS: Pode não ser a melhor maneira de fazer as coisas (eu pessoalmente não conheço melhor), mas foi assim que fiz e funciona 100%.

cumps
 
À medida que analizas o ficheiro xml podes ir criando nós de uma ávore que no final da análise representaria a informação contida no ficheiro. Numa só passagem por todos os nós da árvore podes obter todos os campos que pretendes e colocá-los nas estruturas respectivas.

Claro que a criação desta árvore é mais um nível entre a leitura do ficheiro e o armazenamento da informação.. mas parece-me que facilita tanto a separação de fases de processamento como permite detecção de alguns erros sintácticos no ficheiro xml.


Agora como analisas o ficheiro... a ideia de detectar as tags '<...>' parece-me boa, isso pode ser feito testando se um caracter é uma abertura de tag, '<', ou fecho de tag '>'. Se encontras uma abertura de tag, começas a guardar todos os caracteres que lês, para quando atingires um fim de tag, tens disponível o nome da tag.

Assim no final de uma tag, p.ex. '<fornecedor>', sabes que estás perante uma definicao de fornecedor.

Acabas de dizer, apesar duma maneira um pouco atabalhoada, o funcionamento dum analisador sintáctico.
 
Back
Topo