发新话题
打印

解析XML文件,大家帮忙!!!!!

解析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
请高手帮忙分析一下这段程序!!!!      

TOP

什么警告信息?      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

21:warning: passing arg 1 of 'xmlNodeListGetString' makes pointer from integer without a cast& T* Y( H$ T8 S+ g
in function 'parseDoc':5 e. q2 }: P% m
65:warning:passing arg 1 of 'parseStory' makes integer from pointer without a cast
5 B8 ?* H; W7 m+ b3 F) s  L+ s这是警告信息?/ E1 T$ x7 m) {6 M
另外 "story","storyinfo","keyword"分别是XML文件中的节点元素吗?
2 k1 ]# J% C) |' H" J( D就相当于
/ }% z# E+ h; H! K- <story>
8 h0 P: {) c+ g& o( I$ S- <storyinfo>: \( Z2 ]3 d$ ?: c9 a0 O- a
  <author>John Fleck</author> 7 O9 K; A. ^$ l% O' a* t! F0 \
  <datewritten>June 2, 2002</datewritten> & m: {: H; x  J* [- Q
  <keyword>我来也 example keyword</keyword> 8 U) D7 h$ f/ E) H$ G
  <书目>C++</书目>
5 }) d2 |$ R# v' ]8 [2 d8 }1 G) S# Q2 i  <测试>test</测试>
' |" k  s2 u8 ]" U+ U6 [9 l# s  </storyinfo>
! B. o5 G4 x$ f- <body>+ i, Q3 ~9 H5 q% N% ?: Y. F5 k
  <headline>This is the headline</headline>
' B  x1 [. o6 o  <para>This is the body text.</para>
9 \+ D3 b/ ?9 M( Z& D& `5 n2 T  </body>
; h0 V% }6 ?3 B2 m  </story>
3 S! L( I$ ?) K) L中的story,storyinfo,keywords吗?, L4 E9 E- C# p
如果是为什么执行./x l.xml   一点反映都没有呢?(x为可执行程序名称,l.xml为xml文件)5 X+ D) O& p( H/ P+ ^0 a9 C  K- [
编译命令是:gcc -o x x.c -I/usr/include/libxml2 -L/usr/lib -lxml2 -lz -lm
' t+ D0 j# E, E) m) t编译后仍然有上面的警告信息?      

TOP

函数使用有问题……      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

版主大人* f/ m) S2 U' p  |9 A* p
光说有问题" d* S! F/ R& T
说明白点啊. o$ g; e' R, g+ l, b
解析一下啊      

TOP

解析一下……要说什么呢?+ j$ J8 b! H" {1 p& o
把这个例子好好看看:http://xmlsoft.org/examples/tree1.c对比一下有哪些不一样吧。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

版主同志你的程序好像有问题啊      

TOP

……
- v5 \5 P' I; p9 k4 ^8 m有问题的话据说是libxml2的版本问题。总之去那个网站看看吧http://xmlsoft.org/      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

发新话题