2010-05-17 13 views
7

To, co trzeba zrobić: trzeba czytać dokument XML sformatowany i wydobyć z niej elementy i ich wartości, na przykład w poniższym kodzie:Prosty C XML parser

<user name="Mark"> 
    <param name="Age" value="21"/> 
    <param name="Country" value="NL"/> 
</user> 

muszę wyodrębnić: name = Mark, Age = 21 and Country = NL.

Do dzisiaj wykonywałem to ręczne parsowanie, co jest uciążliwe.

Teraz nie obchodzi mnie, czy plik "właściwego XML" lub wszystko to, nie dbam o DTD lub innych standardowych wymagań XML. Po prostu muszę przeczytać i przeanalizować wartości.

Ktoś wie (inny niż lib eXpat) lib do zrobienia tego lub kodu do zrobienia tego? Dzięki!

Jess

EDIT:

Tak, zapomniałem wspomnieć platformy: Windows i Linux. W czystym C, C++ nie

+2

Kiedy pytasz o biblioteki, możesz wspomnieć o swojej platformie, ponieważ biblioteki mogą być specyficzne dla danej platformy. – WhirlWind

+0

Sprawdź vtd-xml, jest o wiele łatwiejszy w użyciu niż DOM i SAX –

Odpowiedz

7
+0

dzięki, sprawdziłem to i 1) zajęło mi to na zawsze zrozumienie, czego ode mnie chcieli (aby to działało) i 2) narzeka, że ​​nie mam DTD i że mój plik nie jest poprawnie sformatowany. więc nie jest to dobre rozwiązanie. – Jessica

+0

Myślałem o czymś bardziej podobnym do http://www.codeguru.com/cpp/data/data-misc/xml/article.php/c4549 – Jessica

+0

Nie powinno to wymagać DTD, ale wymaga tego XML jest dobrze sformułowany - tzn. Że znaczniki początkowe/końcowe pasują do siebie i że nie ma żadnych nielegalnych znaków oraz że istnieje jeden i jedyny element główny.Jeśli twoje dane wejściowe nie są dobrze sformułowane, może powinieneś to naprawić. Jeśli nie potrzebujesz, aby twoje dane wejściowe były dobrze sformatowanym XML, ale po prostu czymś xml-owskim, możesz łatwo napisać własny parser: Po prostu wyszukaj znaki "<" & ">", aby rozbić je na kawałki, a następnie przeanalizuj każdy kawałek. Dużą złożonością analizatora składni XML jest to, że musi on przetwarzać dowolny uogólniony kod XML na określony model wewnętrzny. –

1

Jeśli C++ jest OK, to możesz spróbować TinyXML. Używam go od kilku lat i działa ładnie.

+0

dziękuję ale to jest proste C – Jessica

+0

Wystarczająco fair ... –

4

Expat parser jest najlepszy Natknąłem - używam go w moim kodu C++ w preferencji do różnych C++ parserami - ale to jest napisane w C. Bardzo łatwy w użyciu i osadzaniu w aplikacji. Więc nie rozumiem, dlaczego w swoim pytaniu mówisz:

(inne niż lib Expat)

masz coś przeciwko temu?

+0

Rzeczywiście, zdecydowanie wybrałbym ekspata biorąc pod uwagę podane wymagania. Jedynym powodem, dla którego nie mogę go wykorzystać w tym przypadku, jest to, że plakat nie jest w stanie zrozumieć struktury danych ze zdarzeń SAX, a zatem potrzebuje DOM? –

+0

Nie, nie mam nic przeciwko temu, w rzeczywistości używam go na innym projekcie, jednak jest duży i do tego potrzebuję bardziej złożonego niż to, czego potrzebuję. więc, jak bardzo wyraźnie wskazywałem na moje pytanie, nie będę expatować jako rozwiązanie – Jessica

+0

@Jessica Musisz mieć własną prywatną definicję słowa "big" - Expat jest mniej więcej parserem XML, tak jak zamierzasz otrzymać. W szczególności jest mniejszy niż Mini-XML. –

4

Co powiedzieli na Mini-XML? Jest lekki, współpracuje z gcc, jest zgodny ANSI-C ...

http://www.minixml.org/index.php

Zgodnie z dokumentacją, aby wyszukać konkretne węzły byłoby tak proste, jak:

/* Find the first "a" element */ 
    node = mxmlFindElement(tree, tree, "a", 
          NULL, NULL, 
          MXML_DESCEND); 

Gdy dojdziesz Węzeł, możesz nim manipulować zgodnie z własnymi wymaganiami.

+0

dzięki, już to opublikowałem (zobacz moją własną odpowiedź na pytanie) – Jessica