从http://ncu.dl.sourceforge.net/sourceforge/tinyxml/tinyxml_2_4_0.tar.gz下载tinyxml,可以根据自己的需要,选择不同的版本。
将tinyxml_2_4_0.tar.gz上传到主机,然后解压执行如下命令:
tar -xzvf tinyxml_2_4_0.tar.gz
成功之后,会在当前目录出现一个tinyxml目录,进入该目录cd tinyxml,然后进行编译,顺序执行如下命令:
cd tinyxml
make
在屏幕上会打印如下输出:
- [dev@localhost tinyxml]$ make
- g++ -c -Wall -Wno-format -g -DDEBUG tinyxml.cpp -o tinyxml.o
- g++ -c -Wall -Wno-format -g -DDEBUG tinyxmlparser.cpp -o tinyxmlparser.o
- g++ -c -Wall -Wno-format -g -DDEBUG xmltest.cpp -o xmltest.o
- g++ -c -Wall -Wno-format -g -DDEBUG tinyxmlerror.cpp -o tinyxmlerror.o
- g++ -c -Wall -Wno-format -g -DDEBUG tinystr.cpp -o tinystr.o
- tinystr.cpp:38: warning: aggregate has a partly bracketed initializer
- g++ -o xmltest -g tinyxml.o tinyxmlparser.o xmltest.o tinyxmlerror.o tinystr.o
没有出现错误,表示编译完成,这时可以执行tinyxml自带的测试程序xmltest。
我直行xmltest之后,打印出一堆乱码,后来就没有管。自己写程序测试了。
为了使用tinyxml开发,使用方便,做了一些配置。
添加环境变量TINYXML_ROOT,编辑.bash_profile,添加如下内容:
- #############################################
- #### for tinyxml
- #############################################
- export TINYXML_ROOT=$HOME/tinyxml
把tinyxml包编译打包成一个连接库,方便开发,这就要修改tinyxml目录下的Makefile。
- #****************************************************************************
- #
- # Makefile for TinyXml test.
- # Lee Thomason
- # www.grinninglizard.com
- #
- # This is a GNU make (gmake) makefile
- #****************************************************************************
- # DEBUG can be set to YES to include debugging info, or NO otherwise
- DEBUG := YES
- # PROFILE can be set to YES to include profiling info, or NO otherwise
- PROFILE := NO
- # TINYXML_USE_STL can be used to turn on STL support. NO, then STL
- # will not be used. YES will include the STL files.
- TINYXML_USE_STL := NO
- #****************************************************************************
- CC := gcc
- CXX := g++
- LD := g++
- AR := ar rc
- RANLIB := ranlib
- DEBUG_CFLAGS := -Wall -Wno-format -g -DDEBUG
- RELEASE_CFLAGS := -Wall -Wno-unknown-pragmas -Wno-format -O3
- LIBS :=
- DEBUG_CXXFLAGS := ${DEBUG_CFLAGS}
- RELEASE_CXXFLAGS := ${RELEASE_CFLAGS}
- DEBUG_LDFLAGS := -g
- RELEASE_LDFLAGS :=
- ifeq (YES, ${DEBUG})
- CFLAGS := ${DEBUG_CFLAGS}
- CXXFLAGS := ${DEBUG_CXXFLAGS}
- LDFLAGS := ${DEBUG_LDFLAGS}
- else
- CFLAGS := ${RELEASE_CFLAGS}
- CXXFLAGS := ${RELEASE_CXXFLAGS}
- LDFLAGS := ${RELEASE_LDFLAGS}
- endif
- ifeq (YES, ${PROFILE})
- CFLAGS := ${CFLAGS} -pg -O3
- CXXFLAGS := ${CXXFLAGS} -pg -O3
- LDFLAGS := ${LDFLAGS} -pg
- endif
- #****************************************************************************
- # Preprocessor directives
- #****************************************************************************
- ifeq (YES, ${TINYXML_USE_STL})
- DEFS := -DTIXML_USE_STL
- else
- DEFS :=
- endif
- #****************************************************************************
- # Include paths
- #****************************************************************************
- #INCS := -I/usr/include/g++-2 -I/usr/local/include
- INCS :=
- #****************************************************************************
- # Makefile code common to all platforms
- #****************************************************************************
- CFLAGS := ${CFLAGS} ${DEFS}
- CXXFLAGS := ${CXXFLAGS} ${DEFS}
- #****************************************************************************
- # Targets of the build
- #****************************************************************************
- OUTPUT := xmltest
- LIB := libtinyxml.so
- all: ${OUTPUT} ${LIB}
- #****************************************************************************
- # Source files
- #****************************************************************************
- SRCS := tinyxml.cpp tinyxmlparser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp
- # Add on the sources for libraries
- SRCS := ${SRCS}
- OBJS := $(addsuffix .o,$(basename ${SRCS}))
- LIBOBJS := tinyxml.o tinyxmlparser.o tinyxmlerror.o tinystr.o
- #****************************************************************************
- # Output
- #****************************************************************************
- ${OUTPUT}: ${OBJS}
- ${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}
- ${LIB}: ${LIBOBJS}
- ar -r $@ ${LIBOBJS}
- #****************************************************************************
- # common rules
- #****************************************************************************
- # Rules for compiling source files to object files
- %.o : %.cpp
- ${CXX} -c ${CXXFLAGS} ${INCS} $< -o $@
- %.o : %.c
- ${CC} -c ${CFLAGS} ${INCS} $< -o $@
- dist:
- bash makedistlinux
- clean:
- -rm -f core ${OBJS} ${OUTPUT} ${LIB} ${TEST}
- depend:
- #makedepend ${INCS} ${SRCS}
- tinyxml.o: tinyxml.h tinystr.h
- tinyxmlparser.o: tinyxml.h tinystr.h
- xmltest.o: tinyxml.h tinystr.h
- tinyxmlerror.o: tinyxml.h tinystr.h
在tinyxml目录下重新执行make,会看到多执行了一行命令:
ar -r libtinyxml.so tinyxml.o tinyxmlparser.o tinyxmlerror.o tinystr.o
生成了一个包libtinyxml.so,有了这个包,使用tinyxml开发的时候,在连接命令中加入这个包的连接,就可以正确地生成目标程序。
现在来写一个小程序测试一下,在tinyxml目录创建一个测试的xml文件,文件名为test.xml,内容如下:
- <Persons>
- <Person ID="1">
- <name>周星星</name>
- <age>20</age>
- </Person>
- <Person ID="2">
- <name>白晶晶</name>
- <age>18</age>
- </Person>
- </Persons>
在tinyxml下创建,也添加了一个测试程序tinyxml_test.cpp,内容如下:
- #include "tinyxml.h"
- #include "tinystr.h"
- #include <iostream>
- using namespace std;
- int main()
- {
- //创建一个XML的文档对象。
- TiXmlDocument *myDocument = new TiXmlDocument("test.xml");
- myDocument->LoadFile();
- //获得根元素,即Persons。
- TiXmlElement *RootElement = myDocument->RootElement();
- //输出根元素名称,即输出Persons。
- cout << RootElement->Value() << endl;
- //获得第一个Person节点。
- TiXmlElement *FirstPerson = RootElement->FirstChildElement();
- //输出接点名Person
- cout << FirstPerson->Value() << endl;
- //获得第一个Person的name节点和age节点和ID属性。
- TiXmlElement *NameElement = FirstPerson->FirstChildElement();
- TiXmlElement *AgeElement = NameElement->NextSiblingElement();
- TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
- //输出第一个Person的name内容,即周星星;age内容,即20;ID属性,即1。
- cout << NameElement->FirstChild()->Value() << endl;
- cout << AgeElement->FirstChild()->Value() << endl;
- cout << IDAttribute->Value() << endl;
- return 0;
- }
在tinyxml目录下修改Makefile,修改之后的内容如下:
- #****************************************************************************
- #
- # Makefile for TinyXml test.
- # Lee Thomason
- # www.grinninglizard.com
- #
- # This is a GNU make (gmake) makefile
- #****************************************************************************
- # DEBUG can be set to YES to include debugging info, or NO otherwise
- DEBUG := YES
- # PROFILE can be set to YES to include profiling info, or NO otherwise
- PROFILE := NO
- # TINYXML_USE_STL can be used to turn on STL support. NO, then STL
- # will not be used. YES will include the STL files.
- TINYXML_USE_STL := NO
- #****************************************************************************
- CC := gcc
- CXX := g++
- LD := g++
- AR := ar rc
- RANLIB := ranlib
- DEBUG_CFLAGS := -Wall -Wno-format -g -DDEBUG
- RELEASE_CFLAGS := -Wall -Wno-unknown-pragmas -Wno-format -O3
- LIBS :=
- DEBUG_CXXFLAGS := ${DEBUG_CFLAGS}
- RELEASE_CXXFLAGS := ${RELEASE_CFLAGS}
- DEBUG_LDFLAGS := -g
- RELEASE_LDFLAGS :=
- ifeq (YES, ${DEBUG})
- CFLAGS := ${DEBUG_CFLAGS}
- CXXFLAGS := ${DEBUG_CXXFLAGS}
- LDFLAGS := ${DEBUG_LDFLAGS}
- else
- CFLAGS := ${RELEASE_CFLAGS}
- CXXFLAGS := ${RELEASE_CXXFLAGS}
- LDFLAGS := ${RELEASE_LDFLAGS}
- endif
- ifeq (YES, ${PROFILE})
- CFLAGS := ${CFLAGS} -pg -O3
- CXXFLAGS := ${CXXFLAGS} -pg -O3
- LDFLAGS := ${LDFLAGS} -pg
- endif
- #****************************************************************************
- # Preprocessor directives
- #****************************************************************************
- ifeq (YES, ${TINYXML_USE_STL})
- DEFS := -DTIXML_USE_STL
- else
- DEFS :=
- endif
- #****************************************************************************
- # Include paths
- #****************************************************************************
- #INCS := -I/usr/include/g++-2 -I/usr/local/include
- INCS :=
- #****************************************************************************
- # Makefile code common to all platforms
- #****************************************************************************
- CFLAGS := ${CFLAGS} ${DEFS}
- CXXFLAGS := ${CXXFLAGS} ${DEFS}
- #****************************************************************************
- # Targets of the build
- #****************************************************************************
- OUTPUT := xmltest
- LIB := libtinyxml.so
- TEST:= tinyxml_test
- all: ${OUTPUT} ${LIB} ${TEST}
- #****************************************************************************
- # Source files
- #****************************************************************************
- SRCS := tinyxml.cpp tinyxmlparser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp
- # Add on the sources for libraries
- SRCS := ${SRCS}
- OBJS := $(addsuffix .o,$(basename ${SRCS}))
- LIBOBJS := tinyxml.o tinyxmlparser.o tinyxmlerror.o tinystr.o
- #****************************************************************************
- # Output
- #****************************************************************************
- ${OUTPUT}: ${OBJS}
- ${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}
- ${LIB}: ${LIBOBJS}
- ar -r $@ ${LIBOBJS}
- ${TEST}: tinyxml_test.o
- ${LD} -o $@ ${LDFLAGS} tinyxml_test.o -L${TINYXML_ROOT} -ltinyxml
- #****************************************************************************
- # common rules
- #****************************************************************************
- # Rules for compiling source files to object files
- %.o : %.cpp
- ${CXX} -c ${CXXFLAGS} ${INCS} $< -o $@
- %.o : %.c
- ${CC} -c ${CFLAGS} ${INCS} $< -o $@
- dist:
- bash makedistlinux
- clean:
- -rm -f core ${OBJS} ${OUTPUT} ${LIB} ${TEST}
- depend:
- #makedepend ${INCS} ${SRCS}
- tinyxml.o: tinyxml.h tinystr.h
- tinyxmlparser.o: tinyxml.h tinystr.h
- xmltest.o: tinyxml.h tinystr.h
- tinyxmlerror.o: tinyxml.h tinystr.h
然后执行make,这时,可以看到多了一个tinyxml_test 生成,执行tinyxml_test,得到如下输出结果:
- Persons
- Person
- 周星星
- 20
- 1