Jump to content

Desenvolver um parser de XML (em C#) - Ideia maluca?


Guest id194
 Share

Recommended Posts

Guest id194

Gostava que me ajudassem a perceber se isto é uma ideia maluca e estou a perder o meu tempo ou se deveria ir em frente... Mas algo me diz que vou desistir.

Basicamente, estou com ideias (e até já comecei) em desenvolver um parser em C# para ficheiros XML, que me permita ler e escrever um XML. Mas a ideia é mais complexa do que o que parece... O que eu queria fazer era criar um conjunto de métodos que sejam o mais simples possíveis para ler/escrever no XML mas cada vez mais estou a ver isto demasiado difícil. A ideia era ter um simples método com um par de argumentos (e não muitos) para sacar um valor do XML (no caso da leitura), mas dependendo da complexidade do XML, isto pode ser complicado.

Por exemplo, imagine-se o seguinte XML:

<root>
  <section1>
    <element1>aaa</element1>
<element2>bbb</element2>
<element3>ccc</element3>
  </section1>
  <section2>
    <element1>aaa</element1>
<element2>bbb</element2>
  </section2>
</root>

Processar uma coisa do género não é difícil e consegue-se fazer isto bem criando uma API simples de usar. O problema é quando XML é mais complexo:

<root>
  <section1>
    <element1>aaa</element1>
<element2>bbb</element2>
<element3>ccc</element3>
  </section1>
  <section2 attr1="xyz" attr2="abc">
    <element1>
  <subelement1>
    <subsubelement1>
    </subsubelement1>
	<subsubelement2>
	  <tag1 attr1="xyz" attr2="abc" />
	  <tag2 attr1="lol" attr2="rotfl" />
	  <tag3 attr1="123" attr2="452">
	    <subtag1>Olá Mundo</subtag1>
	    <subtag2>Xau Mundo</subtag2>
	  </tag3>
	</subsubelement2>
  </subelement1>
</element1>
  </section2>
</root>

E isto digamos que é apenas um nível 2 de complexidade quem um XML pode ter. Todos sabem que existem XMLs bastante mais complexos e eu não quero entrar por ai, para a discussão em questão imagine-se que um XML não fica mais confuso que o último exemplo dado.

Supondo agora que eu queria sacar o valor da subtag1, o attr2 tag2, attr1 da section2 e por ai fora... Basicamente queria fazer um parser global, que funcionasse para todos estes casos mas de uma forma bem simples (refiro-me à API, internamente não precisa de ser muito simples, desde que funcione bem). Ou seja, um método com o nome do elemento e depois do atributo ou do conteúdo e pronto ficava por ai. Mas sem fazer coisas que considero estúpidas, por exemplo, passar um caminho absoluto para uma expressão a ser usado com XPath. Isto não teria lógica, a ideia é simplificar e o utilizador que vai usar este parser deve-se preocupar o menos possível com toda a hierarquia do ficheiro XML.

Acham que estou a perder tempo com algo que não vale a pena? Será que têm ideias/sugestões/comentários/whatever, que me possam ajudar ou fazer mudar de ideias?

Não sei bem explicar exactamente aquilo que tenho na minha mente, mas espero que o que acabei de escrever seja suficiente...

Link to comment
Share on other sites

Guest id194

Não não trás um parser de XML, não da maneira que eu estou a falar. Desculpa lá mas não lês-te o meu post com atenção. Eu estou a usar tudo aquilo que o .NET me oferece para trabalhar com ficheiros XML para tentar criar algo muito mais simplificado.

Link to comment
Share on other sites

aconselho-te a "estudares" bem as API's do .net para XML.

quanto a pesquisas/extracção em documentos XML, usa o XPATH Queries.  (google it)

pessoalmente penso que estás a re-inventar a roda...

/ing

I used to have a life ... but i bought a programmable machine in 1982 ...

Link to comment
Share on other sites

Nazgulled não é por nada mas eles tem razão mais ou menos o que dizem.

Tipo fazer uma função que busca o valor de um dado nodo, por exemplo subtag1 como referiste em cima.

Presumindo que já tens o XmlDocument carregado do ficheiro.

public String GetNodeValue(String nodeName) {
   XmlNode n = documento.SelectSingleNode("//" + nodeName);
   if (n != null)
      return n.Value;
   
   return null;
}

Isto presumindo que se quer obter o 1º nodo com esse nome. Também é igualmente fácil fazer antes a devolver a lista do conteúdo de todos os nodos com esse nome.

Mas percebo o que queres dizer. Acho que é uma tarefa aliciante para aprendizagem e prática da linguagem. Se calhar para ser mais aliciante seria fazer algo pro LINQ para ficheiros XML a simular um pouco o uso do HaXML. Seria um desafio porreiro.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Guest id194

Não têm razão nenhuma porque nenhum de vocês percebeu o que eu quis dizer... O código que apresentaste aqui é o que eu já tenho (parecido), but that's not the point!

Esqueçam este tópico, não vale a pena discutir isto se não entendem onde quero chegar.

Link to comment
Share on other sites

Se não conseguiram entender o que pretendes talvez seja melhor explicares com outras palavras em vez de insistires para que leiam um texto que, até tu, dizes que não perceberam. Explica-te melhor para que te entendam melhor.

Quanto a criares um parser C#, na verdade não sei como anda o universo de parsers em C#, se for como o de Java, então o que queres fazer já deve estar feito. Em C# usei apenas a API que o .net oferece e nunca procurei outra API.

Cheguei a criar algo parecido com o que pretendes, mas a verdade é que uma forma mais simples de ler/escrever XML não é mais do que um wrapper em torno do que existe, isto é, a ideia não é maluca, é algo que penso que qualquer programador que use XML acaba por fazer, agarrar num parser que existe e encapsular os seus métodos em apenas um ou dois métodos de leitura e escrita, talvez mais um para pesquisa simples. Mas isso acabei também por concluir que isso já existia feito, embora a quantidade de parsers seja tanta e com capacidades tão variadas, apanhei parsers que tinham uma API bastante simples, mas que não tinham as funcionalidades que pretendia.

Resumindo, a tua ideia é uma ideia muito natural quando estamos a trabalhar com XML, especialmente se estivermos a usar um parser SAX e não DOM, e pensamos que aquilo até podia ser mais simples, normalmente acabamos por encapsular uma lógica nossa num método de leitura e criamos assim uma segunda API mais simples de usar. Isto acontece de forma repetida pelo que ter uma API que nos oferecesse essa facilidade logo de início seria bom.

Tens de verificar se não existe já um qualquer parser em C# que faça isso, ou que faça da forma que queres para não estares a reinventar a roda, e a perder tempo que podias usar noutros projectos, se não encontrares nenhum que cumpra os requisitos que pretendes avança com a ideia, mas vais ter de aprender muito sobre XML e as tecnologias associadas, porque criares um parser com uma API simples mas que não ofereça as capacidades mais comuns dos parsers existentes vai fazer com que o projecto acabe a ser usado apenas por ti.

Talvez a ideia não seja criares algo de raiz mas construires em cima de algum parser que exista.

Link to comment
Share on other sites

Guest id194

Não me consigo explicar melhor do que o que fiz no primeiro post, se as pessoas não percebem, paciência. Se não percebem, não se discute este assunto e pronto. Não posso fazer nada, não sei explicar melhor aquilo que pretendo.

Quanto aos parsers em C#, se calhar não usei bem as palavras, mas tu percebeste mais ou menos aquilo que eu quero fazer (terceiro paragrafo teu), ou seja, um wrapper para trabalhar com o XmlDocument do C# (por exemplo). Criar um conjunto de métodos que me facilite a escrita/leitura em ficheiros XML.

Sim, é capaz de já existir isto que eu pretendo fazer e ate era melhor porque eu não queria perder tempo a escrever isto. Mas eu postei isto aqui porque apenas comecei a programar este "parser" porque não encontrei nenhum depois de pesquisar umas horas no google. Ainda à procura por um DLL (se tivesse código fonte ou não era indiferente, desde que fizesse o que eu pretendia) que desse para eu usar em C# e ler/escrever em XML de forma simples. Mas não encontrei nada.

Quer dizer, encontrei um mas não gostei:

1) É um DLL de 4Mb pois é um pacote de bibliotecas basicamente e eu queria algo mais pequeno/simplificado.

2) Apesar de dizer que é freeware em todo o lado, instalei e aquilo diz que só funciona durante 30 dias, depois tenho de ter uma chave para colocar no código ou deixa de funcionar.

3) Tive a ler a documentação da coisa e pareceu-me complexo de mais para aquilo que eu pretendo.

Se encontrarem algum, força... Até agradeço e poupam-me trabalho, o que eu queria... Mas eu já procurei bastante e não consegui encontrar nada!

Link to comment
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
 Share

×
×
  • 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.