解析XML文件,大家帮忙!!!!!
各位我在网上看到了一个解析XML文档得C程序,但我执行时,老是出现错误,请教各位大师:3 ?# h7 i6 d9 X! Y2 R: v7 c
#include <stdio.h>;
9 Z! \6 n, R8 g6 J; H+ ?: F
7 m' l( K( n" m& U5 ^#include <string.h>;
; d; B, G5 R. @! g% P, \. |1 x! J. T1 V" K
#include <stdlib.h>;
+ M3 k2 k0 \6 l. J) g1 c, f+ Y
% O% [. s# ?% g+ H- A5 ?6 z, r, e#include <libxml/xmlmemory.h>;
) w, W- d/ u5 s7 b$ {2 }' t/ x
#include <libxml/parser.h>;
( i; v; D, x% J4 N8 ?/ b+ o* z' e; t- Y- p. N6 ^- N. c! g4 j1 w
+ j/ h! b9 ]7 o6 X* O
3 W6 I& U) a2 F/ @
void
* e, M$ S# y: c/ D j# s) U1 H8 f" g0 p$ ~7 A& a0 |" Y
parseStory (xmlDocPtr doc, xmlNodePtr cur) {
D- u% c7 g8 D0 b5 J
5 ~% | q" A1 G" x; _0 j& D
2 i# t0 x3 R+ U) c) ]
: s4 d. d# E1 T3 @& y( Z xmlChar *key;" ]! d U/ v# s4 _: q: w
0 t* V, F' |" l5 m cur = cur->xmlChildrenNode;/ L5 T" d, l7 C) c4 i; @
* S$ v2 z1 d+ z5 C) k! i0 W" G3 C
while (cur != NULL) {
0 T' S) b/ B6 [& k# O# S# D) q& k ]
if ((!xmlStrcmp(cur->;name, (const xmlChar *)"keyword"))) {! O) d0 D1 v" i2 ^5 \1 j
7 W. {3 Y$ o! {" k& k; P key = xmlNodeListGetString(doc, cur->;xmlChildrenNode, 1);
1 {$ F9 {8 S( |( C; a7 Q: z I# b5 J& g
printf("keyword: %s\n", key);! e+ ~/ W1 w2 s$ O- v
$ G$ M/ W" z( z3 A- z7 C# [ {
xmlFree(key);, q6 C$ ~% R6 P
. `1 _6 ^, A$ L# a1 G5 E9 _* Q8 Y8 H }
2 j Q d9 V$ p; ?5 T& d3 W
; u- k1 W9 L: l2 z( s8 V cur = cur->next;
* ^( |, S: ]0 q& g. y. i/ g: e
5 A I. W5 y: s% C" S" f( U }
9 n% J) f+ `# Z3 E2 {( l* Y" L! A* y1 y% X0 A; s
return;( l" B6 R- M6 |; i9 `3 q
' X) Z% H/ p& u+ m8 }}1 h- ~$ \% p" W5 f- j
, ^# @4 f; \3 M2 t7 [ . A9 i G* G# |9 I
p" q9 t+ B) W( jstatic void9 S$ k( O. f9 Y9 J
% f" A8 N3 _' N4 W8 A
parseDoc(char *docname) {3 f4 h. j I6 B3 o/ P
5 O3 |; u* O' |8 x' G" R8 {
) T: c7 S. s& a/ O
6 G* g: V/ D# x xmlDocPtr doc;
7 ]% u( ^# \% j8 R7 \0 r& K3 }% ~8 Y" i' t b. r) N! k+ V
xmlNodePtr cur;
# D9 u# G! W8 x- Z# ~5 f8 S3 {( A1 T& [& W
1 e0 q% I) } a+ m( I0 L9 K
: L) H2 N8 {( w7 f
doc = xmlParseFile(docname);$ T8 \, j( Y- }1 o5 ~
2 u/ g! b3 e) O, d8 F2 j/ y) K , D, y F! ^5 E/ R; _* k$ E' U
/ G+ m1 e4 T( _# A- d
if (doc == NULL ) {: [! H% v- u; ~9 d3 W+ }
$ G7 {% m) f# o# v* V3 n- u0 } fprintf(stderr,"Document not parsed successfully. \n");5 G- n9 y% V$ c R
7 g K2 w7 {$ _, Q, ~3 V& g
return;3 g6 e! Y3 G( I! [. a. W
! q: r; j0 i5 O/ I4 K3 k# y
}0 K# e; ^/ _7 |0 c3 ~: l
) a$ i$ E7 t/ j
% o6 t. w" @( h- J& ]
) B7 m5 N% g3 ^+ @- V# Y h cur = xmlDocGetRootElement(doc);- G. N2 r6 a7 B, `9 i- J
, X z7 o& `1 i( d$ y8 x
0 e) j: F! x U1 a. g5 N: Z1 H2 |+ @4 s3 {0 V
if (cur == NULL) {& C6 J, I7 a; o5 T
3 I* [& m7 o2 j, Q2 K+ Y) J1 ] fprintf(stderr,"empty document\n");$ V# V- v. U7 k# U# p- |, r* D
: \) L! [2 q8 |* J
xmlFreeDoc(doc);
- W3 Z' m$ e$ x! ^- |' ~8 `+ L( r5 S o4 f7 |4 X
return;$ v: f5 t7 j3 Z( v. R0 s D
, z v+ {' s* k3 R) l }
- V( @5 ?& G6 g: p; s( e! S! l
/ ~+ o. F! Q: V, J ! ^3 X5 {- V4 W0 A+ ?4 _, g1 R
: e- a: O' F3 U if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {( K) A8 w$ z1 I1 }$ X+ y, E a
4 c! A6 J; M4 `' n- O$ z
fprintf(stderr,"document of the wrong type, root node != story");' U& F2 H( [- p) Y
1 Z* A, ~. K* Y# ~. Q( j7 ~
xmlFreeDoc(doc);0 n+ s3 s# ~" p6 y/ ]
! @3 }) y& ]1 b8 p$ a5 Q2 v0 `
return;
. o& R0 a9 [* E" x7 b# v
+ c. E8 y% b+ }: v4 `3 ^+ t }/ @* Z0 U0 x6 T# \+ k
7 g+ [" j$ a1 k2 M0 i
- n: g7 r. T; ?0 v1 ]
# M4 S# i6 h/ l, B. K
cur = cur->xmlChildrenNode;. } L* _6 Q& j' H# U) d2 g
( K& O* O$ F& a. C, j7 H: @ while (cur != NULL) {
8 T @ w3 H. \) @) t4 w3 N
8 |" [5 v' ^! O. X: f$ j if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){4 o* o' C u7 W4 V; j d
' |' Z# E$ K d2 J
parseStory (doc, cur);; E1 ?' Y) \2 X" Z/ \* @
# }* q- G# p7 }, l# j& t }2 W, r1 h( m3 ]/ U
, S. m& e% }& P+ N$ _% _; A
: m. }2 _! W: k& D) H# C% H5 l7 W% F' n! p, U
6 i& }1 \$ I3 Y! v7 _ cur = cur->next;
! `$ y1 U' e2 ^& M$ L3 v) |1 a0 x; E7 \
}9 l/ i! ~8 v' d3 U
2 M- L" [0 p, p9 I+ F" j: d! t! C & K' g! Z1 @: U8 @
" D# q5 O: p% g$ }7 S! i/ Q
xmlFreeDoc(doc);) V7 Q$ h, M) [, d% B
2 M! y( c* U/ S3 i( j return;
8 J0 A, Y3 v; K# q( Y: @0 G0 b# _& X( t; o' ]: J2 I( b
}; B" i# L" ^' l" v O; w$ `/ z& g
2 n8 v0 X+ @, J: t$ r
- m6 I* X# U* g! ?8 i
5 G |2 V5 u. u! U" V. ^ N
int) s3 K4 n/ M2 d: ?/ O: [/ J7 |
6 r/ q8 i3 @( n& a2 z4 c6 w/ [- j2 E2 kmain(int argc, char **argv) {
3 t$ `% n1 N$ P$ M2 c
4 g7 v: ], n2 }' [2 F
) F) M1 o' Y: F) U5 b
P% g8 w% H% u( _' n; i char *docname;
9 n7 R ], e7 J" b: Y( }6 I# l' ?( p! J o' w% g3 @7 A) _
5 J' b6 x/ D! o+ o$ ~+ S1 q
+ o7 c! ~$ f) T' D if (argc <= 1) {% E/ U$ o6 X( ?& g4 N" V1 o
& h/ J1 q8 c8 i4 [! E printf("Usage: %s docname\n", argv[0]);6 q6 M4 J0 T+ u, A( |
{2 o l. c4 l1 B- e( | return(0);; o6 ]8 A9 F% w3 d
. L5 b8 Z# T5 w1 f) O: m- H }
) s0 j! a5 X# g0 l( ^$ d6 {8 P$ Q& t+ v- `3 D
; j- z4 A% L. J4 x% Q
7 I! `1 ~3 V3 A$ l
docname = argv[1];/ i) P# p+ k0 i" K% c
2 T$ X7 ^& t! [. b, i+ j$ K
parseDoc (docname);
# Y9 h; [$ x6 E9 w& U( ]8 F1 m( x( n3 {9 P4 E
* N1 Y/ r9 z& _: x+ k+ l3 j& I6 ]5 n7 q
8 s/ K6 o3 L: Y$ H& Q- v V
return (1); r2 d- S d+ l8 e
' i) w3 V; w% M/ |/ v0 [
}: K: U3 f2 u4 j* |$ ^& Q) F3 S
# Z1 B2 T- Y, j- e" Z
我gcc -o x x.c -I/usr/include/libxml2 -L/usr/lib -lxml2 -lz -lm
9 P( O; A3 H6 E5 q后出现两条警告信息,
6 `0 A8 o) j. X& ^7 P然后执行./x pos.xml x为可执行文件名称,pos.xml为 xml文件名称,没反应,: C$ l9 {% S& M6 U; h
请高手帮忙分析一下这段程序!!!!