¡¾·½·¨Ò»¡¿
Libxml2ÊǸöCÓïÑÔµÄXML³Ìʽ¿â£¬Äܼòµ¥·½±ãµÄÌṩ¶ÔXMLÎļþµÄ¸÷ÖÖ²Ù×÷£¬²¢ÇÒÖ§³ÖXPATH²éѯ£¬¼°²¿·ÖµÄÖ§³ÖXSLTת»»µÈ¹¦ÄÜ¡£Libxml2µÄÏÂÔØµØÖ·ÊÇhttp://xmlsoft.org/
ÍêÈ«°æµÄ¿âÊÇ¿ªÔ´µÄ£¬²¢ÇÒ´øÓÐÀý×Ó³ÌʽºÍ˵Ã÷Îļþ¡£ÓÉÓÚÎÒÊÇÔÚlinuxÏÂÓÃCÓïÑÔ½øÐÐÑз¢µÄ£¬ËùÒÔÎÒÏÂÔØµÄÊÇlibxml2-2.6.20.tar.gz°æ±¾µÄÔ´Âë°ü¡£
¾ßÌå°²×°²½Ö裺
1¡¢½âѹ£º$tar zxvf libxml2-2.6.20.tar.gz
2¡¢½øÈë½âѹºóµÄ°²×°Ä¿Â¼£º$cd libxml2-2.6.20
3¡¢°²×°Èý²¿Çú£º1£©$./configure
2)$make
3)$make install
°²×°Íê±Ï¡£
libxml2°²×°ÖгöÏֵĴíÎó:
cannot remove `libtoolT': No such file or directory
½â¾ö·½·¨:
ÐÞ¸ÄconfigureÎļþ
$ vim configure
ɾ³ýÕâÒ»ÐÐ: $RM "$cfgfile"
ÖØÐÂÔÙÔËÐÐ $ ./configure
ÄãÔÚ°²×°libxml2µÄʱºò£¬./configure --prefix=/usr/local
ÄãÔÚ°²×°ºÃºó£¬ÐèÒªÖØÐ¶¨Ò壺
export LD_LIBRARY_PATH=/usr/local/lib
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
¾ßÌåµÄλÖøù¾ÝprefixÖ¸¶¨µÄ·¾¶¶¨¡£
¡¾·½·¨¶þ¡¿
#sudo apt-get install libxml2
#sudo apt-get install libxml2-dev
¡¾·½·¨Èý¡¿
libxml2 °²×°Ê¹Óà ÊÕ²Ø
ÔÚÏîÄ¿ÖÐÐèÒª¶ÔÊý¾ÝµÄ±£´æÓë½»»»£¬ÎªÁË·½±ãÆÚ¼äʹÓÃÆÕͨÎı¾±£´æ¡£µ«¶ÔÎı¾½âÎöʱ£¬¿¼Âǵ½³ÌÐòµÄ½¡×³ÐÔ¾ÍÐèÒª´¦Àí¶àÖÖÒâÍâÇé¿ö£¬±È½ÏÂé·³£¬Òò´Ë¶Ôxml²úÉúÁ˵ãÐËȤ¡£xml±¾ÉíÍøÕ¾ÉÏÓдó°ÑµÄ×ÊÁÏ£¬¿ÉÒÔËæÊ±²Î¿¼¡£
GnomeÏîÄ¿ÌṩÁËÒ»¸öxmlµÄC½âÎöÆ÷:Libxml2¡£libxml2×îÐÂÌṩÁËxmlreader½Ó¿Ú£¬Ê¹Óúܷ½±ã£¬²»¹ý°æ±¾ÔÚ2.6ÒÔÉϲÅÖ§³Ö¡£½ñÌìµ¹ÌÚÁËÒ»ÁËÏ£¬×öÁËϼòµ¥²âÊÔ£¬ÔÚ±àÒë×Ô¼ºµÄС³ÌÐòÉϱ»°èÁËһϣ¬Ð´ÎļÍÄî¡£
ÏÖÔÚµÄ×îа汾ÊÇ2.6.30£¬¿ÉÒÔµ½http://ftp.gnome.org/pub/GNOME/sources/libxml2/2.6/ ÏÂÔØ¡£
°²×°ºÜ¼òµ¥£¬Èý²¿×ß¡£
// install
#./configure
#make
#make install
//test install
#make tests
//uninstall
#make uninstall
Èç¹û²»ÐèÒªÌØ±ðµÄ¶¨ÖÆ£¬ÔÚconfigure½×¶Î¿ÉÒÔÖ±½ÓĬÈÏ¡£ libxml2½«Ä¬ÈϰÑÍ·ÎļþÓë¿â°²×°ÔÚ/usr/local/include/libxml2/libxmlĿ¼Ï¡£Òò´Ë¿ÉÄÜ»áÈÃÄãÔÚµÚÒ»´Î±àÒë×Ô¼ºµÄ³ÌÐòʱÓöµ½Í·Îļþ¡°no such file¡±µÄ´íÎó.±ÈÈçÎÒ×Ô¼º¾ÍÕâô±¿.
libxml2ÌṩÁ˽â¾ö·½·¨£¬ËüºÜÌåÌùµØÔÚ/usr/local/binĿ¼ÏÂΪÄúÌṩÁËxml2-config¡¢xmlcatalog¡¢xmllintÈý¸ö±ãÀûµÄ¹¤¾ß£¨àÖ¹¾Ï£ºÆäʵһµã¶¼²»±ãÀû£¬Ìáǰ¸øÈË˵϶àºÃ°¡£¬»¹µÃº¦ÈËÈ¥²é×ÊÁÏ£©¡£ÆäÖÐxml2-configÔÚ±àÒëʱÓõõ½¡£
xml2-config¿ÉÒÔ¡£¡£¡£×Ô¼º¿´ÏÂÃæ°É
[root@Amanda ~]# xml2-config
Usage: xml2-config [OPTION]
Known values for OPTION are:
--prefix=DIR change libxml prefix [default /usr/local]
--exec-prefix=DIR change libxml exec prefix [default /usr/local]
--libs print library linking information
--cflags print pre-processor and compiler flags
--modules module support enabled
--help display this help and exit
--version output version information
ÕâÀï˵µ½±àÒëʱÓõ½µÄ²ÎÊý: --cflagsºÍ--libs£¬°ïÖúÉÏ˵Ã÷Õâ¸öΪ¹¤³Ì±àÒëʱÌṩ¸¨Öú¡£ËüÃÇÌṩµÄÐÅÏ¢ÈçÏ£º
[root@Amanda ~]# xml2-config --cflags
-I/usr/local/include/libxml2
[root@Amanda ~]# xml2-config --libs
-L/usr/local/lib -lxml2 -lz -lm
ËùÒÔÔÚ±àÒë×Ô¼ºµÄ²âÊÔ³ÌÐòʱ£¬¿ÉÒÔÖ±½ÓʹÓà #gcc -I /usr/local/include/libxml2 -L/usr/local/lib -lxml2 -lz -lm -o test test.c ¡£
»òÕß¼ÓÈëµ½makefileÖУ¬ÀýÈ磺
CFLAGS=`xml2-config --cflags`
LIBS=`xml2-config --libs`
²âÊÔ³ÌÐò£º
#include
#include
#include
int main(int argc, char **argv)
{
xmlDocPtr doc = NULL;
xmlNodePtr root_node = NULL, node = NULL, node1 = NULL;
doc = xmlNewDoc(BAD_CAST "1.0");
root_node = xmlNewNode(NULL, BAD_CAST "root");
xmlDocSetRootElement(doc, root_node);
xmlNewChild(root_node, NULL, BAD_CAST "node1",BAD_CAST "content of node1");
node=xmlNewChild(root_node, NULL, BAD_CAST "node3",BAD_CAST"node has attributes");
xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes");
node = xmlNewNode(NULL, BAD_CAST "node4");
node1 = xmlNewText(BAD_CAST"other way to create content");
xmlAddChild(node, node1);
xmlAddChild(root_node, node);
xmlSaveFormatFileEnc(argc > 1 ? argv[1] : "-", doc, "UTF-8", 1);
xmlFreeDoc(doc);
xmlCleanupParser();
xmlMemoryDump();
return(0);
}
ÓÃÏÂÃæµÄÃüÁî±àÒëͨ¹ý¡£
gcc -I /usr/local/include/libxml2 -L /usr/local/lib -lxml2 test.c -o test
¶þ¡¢Libxml2ÖеÄÊý¾ÝÀàÐͺͺ¯Êý
Ò»¸öº¯Êý¿âÖпÉÄÜÓм¸°ÙÖÖÊý¾ÝÀàÐͼ°¼¸Ç§¸öº¯Êý£¬²»¹ý¼Çס´óʦµÄ»°£¬90%µÄ¹¦Äܶ¼ÊÇÓÉ30%µÄÄÚÈÝÌṩµÄ¡£¶ÔÓÚlibxml2£¬ÎÒÈÏΪ¸ã¶®ÒÔϵÄÊý¾ÝÀàÐͺͺ¯Êý¾Í×ã¹»ÁË¡£
2.1 ÄÚ²¿×Ö·ûÀàÐÍxmlChar
xmlCharÊÇLibxml2ÖеÄ×Ö·ûÀàÐÍ£¬¿âÖÐËùÓÐ×Ö·û¡¢×Ö·û´®¶¼ÊÇ»ùÓÚÕâ¸öÊý¾ÝÀàÐÍ¡£ÊÂʵÉÏËûµÄ¶¨ÒåÊÇ£ºxmlstring.h
typedef unsigned char xmlChar;
ʹÓÃunsigned char×÷ΪÄÚ²¿×Ö·û¸ñʽÊÇ¿¼Âǵ½ËûÄܷdz£ºÃÊÊÓ¦UTF-8±àÂ룬¶øUTF-8±àÂëÕýÊÇlibxml2µÄÄÚ²¿±àÂ룬ÆäËû¸ñʽµÄ±àÂëҪת»»ÎªÕâ¸ö±àÂë²ÅÄÜÔÚlibxml2ÖÐʹÓá£
»¹¾³£ÄÜ¿´µ½Ê¹ÓÃxmlChar*×÷Ϊ×Ö·û´®ÀàÐÍ£¬·Ç³£¶àº¯Êý»á·µ»ØÒ»¸ö¶¯Ì¬·ÖÅäÄÚ´æµÄxmlChar*±äÁ¿£¬Ê¹ÓÃÕâÑùµÄº¯Êýʱ¼ÇµÃÒªÊÖ¶¯É¾³ýÄÚ´æ¡£
2.2 xmlCharÏà¹Øº¯Êý
Èçͬ±ê×¼cÖеÄcharÀàÐÍÏàͬ£¬xmlCharÒ²Óж¯Ì¬ÄÚ´æ·ÖÅä¡¢×Ö·û´®²Ù×÷µÈÏà¹Øº¯Êý¡£ÀýÈçxmlMallocÊǶ¯Ì¬·ÖÅäÄÚ´æµÄº¯Êý£»xmlFreeÊÇÅäÌ×µÄÊÍ·ÅÄڴ溯Êý£»xmlStrcmpÊÇ×Ö·û´®±È½Ïº¯ÊýµÈµÈ¡£
»ù±¾ÉÏxmlChar×Ö·û´®Ïà¹Øº¯Êý¶¼ÔÚxmlstring.hÖж¨Ò壻¶ø¶¯Ì¬ÄÚ´æ·ÖÅ亯ÊýÔÚxmlmemory.hÖж¨Òå¡£
2.3 xmlChar*ºÍÆäËûÀàÐÍÖ®¼äµÄת»»
ÁíÍâҪעÒ⣬ÒòΪ×ÜÊÇÒªÔÚxmlChar*ºÍchar*Ö®¼ä½øÐÐÀàÐÍת»»£¬ËùÒÔ¶¨ÒåÁËÒ»¸öºêBAD_CAST£¬Æä¶¨ÒåÈçÏ£ºxmlstring.h
#define BAD_CAST (xmlChar *)
ÔÔòÉÏÀ´Ëµ£¬unsigned charºÍcharÖ®¼ä½øÐÐÇ¿ÖÆÀàÐÍת»»ÊÇûÓÐÎÊÌâµÄ¡£
2.4 ÎļþÀàÐÍxmlDoc¡¢Ö¸ÕëxmlDocPtr
xmlDocÊǸöstruct£¬±£´æÁËÒ»¸öxmlµÄÏà¹ØÐÅÏ¢£¬ÀýÈçÎļþÃû¡¢ÎļþÀàÐÍ¡¢×Ó½ÚµãµÈµÈ£»xmlDocPtrµÈÓÚxmlDoc*£¬Ëû¸ã³ÉÕâ¸öÑù×Ó×ÜÈÃÈËÒÔΪÊÇÖÇÄÜÖ¸Õ룬Æäʵ²»ÊÇ£¬ÒªÊÖ¶¯É¾³ýµÄ¡£
xmlNewDocº¯Êý´´½¨Ò»¸öеÄÎļþÖ¸Õë¡£
xmlParseFileº¯ÊýÒÔĬÈÏ·½Ê½¶ÁÈëÒ»¸öUTF-8¸ñʽµÄÎļþ£¬²¢·µ»ØÎļþÖ¸Õë¡£
xmlReadFileº¯Êý¶ÁÈëÒ»¸ö´øÓÐijÖÖ±àÂëµÄxmlÎļþ£¬²¢·µ»ØÎļþÖ¸Õ룻ϸ½Ú¼ûlibxml2²Î¿¼Êֲᡣ
xmlFreeDocÊÍ·ÅÎļþÖ¸Õë¡£ÌØ±ð×¢Ò⣬µ±Äãµ÷ÓÃxmlFreeDocʱ£¬¸ÃÎļþËùÓаüº¬µÄ½ÚµãÄÚ´æ¶¼±»ÊÍ·Å£¬ËùÒÔÒ»°ãÀ´Ëµ²»±ØÊÖ¶¯µ÷ÓÃxmlFreeNode»òxmlFreeNodeListÀ´ÊͷŶ¯Ì¬·ÖÅäµÄ½ÚµãÄڴ棬³ý·ÇÄã°Ñ¸Ã½Úµã´ÓÎļþÖÐÒÆ³ýÁË¡£Ò»°ãÀ´Ëµ£¬Ò»¸öÎļþÖÐËùÓнڵ㶼Ӧ¸Ã¶¯Ì¬·ÖÅ䣬Ȼºó¼ÓÈëÎļþ£¬×îºóµ÷ÓÃxmlFreeDocÒ»´ÎÊÍ·ÅËùÓнڵãÉêÇëµÄ¶¯Ì¬Äڴ棬ÕâÒ²ÊÇΪʲôÎÒÃǷdz£ÉÙ¿´¼ûxmlNodeFreeµÄÔÒò¡£
xmlSaveFile½«ÎļþÒÔĬÈÏ·½Ê½´æÈëÒ»¸öÎļþ¡£
xmlSaveFormatFileEnc¿É½«ÎļþÒÔijÖÖ±àÂë/¸ñʽ´æÈëÒ»¸öÎļþÖС£
2.5 ½ÚµãÀàÐÍxmlNode¡¢Ö¸ÕëxmlNodePtr
½ÚµãÓ¦¸ÃÊÇxmlÖÐ×îÖØÒªµÄÔªËØÁË£¬xmlNode´ú±íÁËxmlÎļþÖеÄÒ»¸ö½Úµã£¬ÊµÏÖΪһ¸östruct£¬ÄÚÈݷdz£·á¸»£ºtree.h
typedef struct _xmlNode xmlNode;
typedef xmlNode *xmlNodePtr;
struct _xmlNode {
void *_private;/* application data */
xmlElementType type; /* type number, must be second ! */
const xmlChar *name; /* the name of the node, or the entity */
struct _xmlNode *children; /* parent->childs link */
struct _xmlNode *last; /* last child link */
struct _xmlNode *parent;/* child->parent link */
struct _xmlNode *next; /* next sibling link */
struct _xmlNode *prev; /* previous sibling link */
struct _xmlDoc *doc;/* the containing document */
/* End of common part */
xmlNs *ns; /* pointer to the associated namespace */
xmlChar *content; /* the content */
struct _xmlAttr *properties;/* properties list */
xmlNs *nsDef; /* namespace definitions on this node */
void *psvi;/* for type/PSVI informations */
unsigned short line; /* line number */
unsigned short extra; /* extra data for XPath/XSLT */
};
ÄÜ¿´µ½£¬½ÚµãÖ®¼äÊÇÒÔÁ´±íºÍÊ÷Á½ÖÖ·½Ê½Í¬Ê±×éÖ¯ÆðÀ´µÄ£¬nextºÍprevÖ¸ÕëÄÜ×é³ÉÁ´±í£¬¶øparentºÍchildrenÄÜ×é֯ΪÊ÷¡£Í¬Ê±¸üÓÐÒÔÏÂÖØÒªÔªËØ£º
l ½ÚµãÖеÄÎÄ×ÖÄÚÈÝ£ºcontent£»
l ½ÚµãËùÊôÎļþ£ºdoc£»
l ½ÚµãÃû×Ö£ºname£»
l ½ÚµãµÄnamespace£ºns£»
l ½ÚµãÊôÐÔÁÐ±í£ºproperties£»
XmlÎļþµÄ²Ù×÷Æä¸ù±¾ÔÀí¾ÍÊÇÔÚ½ÚµãÖ®¼äÒÆ¶¯¡¢²éѯ½ÚµãµÄ¸÷ÏîÐÅÏ¢£¬²¢½øÐÐÔö¼Ó¡¢É¾³ý¡¢Ð޸ĵIJÙ×÷¡£
xmlDocSetRootElementº¯ÊýÄܽ«Ò»¸ö½ÚµãÉèÖÃΪij¸öÎļþµÄ¸ù½Úµã£¬ÕâÊǽ«ÎļþºÍ½ÚµãÁ¬½ÓÆðÀ´µÄÖØÒªÊֶΣ¬µ±ÓÐÁ˸ù½áµãÒÔºó£¬ËùÓÐ×Ó½Úµã¾ÍÄÜÒÀ´ÎÁ¬½ÓÉϸù½Úµã£¬´Ó¶ø×éÖ¯³ÉΪһ¸öxmlÊ÷¡£
2.6 ½Úµã¼¯ºÏÀàÐÍxmlNodeSet¡¢Ö¸ÕëxmlNodeSetPtr
½Úµã¼¯ºÏ´ú±íÒ»¸öÓɽڵã×é³ÉµÄ±äÁ¿£¬½Úµã¼¯ºÏÖ»×÷ΪXpathµÄ²éѯ½á¹û¶ø³öÏÖ£¨XPATHµÄ½éÉܼûºóÃæ£©£¬Òò´Ë±»¶¨ÒåÔÚxpath.hÖУ¬Æä¶¨ÒåÈçÏ£º
/*
* A node-set (an unordered collection of nodes without duplicates).
*/
typedef struct _xmlNodeSet xmlNodeSet;
typedef xmlNodeSet *xmlNodeSetPtr;
struct _xmlNodeSet {
int nodeNr; /* number of nodes in the set */
int nodeMax; /* size of the array as allocated */
xmlNodePtr *nodeTab;/* array of nodes in no particular order */
/* @@ with_ns to check wether namespace nodes should be looked at @@ */
};
ÄÜ¿´³ö£¬½Úµã¼¯ºÏÓÐÈý¸ö³ÉÔ±£¬·Ö±ðÊǽڵ㼯ºÏµÄ½ÚµãÊý¡¢×î´ó¿ÉÈÝÄɵĽڵãÊý£¬¼°½ÚµãÊý×éÍ·Ö¸Õë¡£¶Ô½Úµã¼¯ºÏÖи÷¸ö½ÚµãµÄ·ÃÎÊ·½Ê½·Ç³£¼òµ¥£¬ÈçÏ£º
xmlNodeSetPtr nodeset = XPATH²éѯ½á¹û;
for (int i = 0; i nodeNr; i++)
{
nodeset->nodeTab;
}
×¢Ò⣬libxml2ÊǸöcº¯Êý¿â£¬Òò´ËÆäº¯ÊýºÍÊý¾ÝÀàÐͶ¼Ê¹ÓÃcÓïÑԵķ½Ê½À´´¦Àí¡£Èç¹ûÊÇc++£¬ÎÒÏëÎÒÄþÔ¸ÓÃSTLÖеÄvectorÀ´±íʾһ¸ö½Úµã¼¯ºÏ¸üºÃ£¬¶øÇÒûÓÐÄÚ´æÐ¹Â©»òÒç³öµÄµ£ÓÇ¡£
3. ¼òµ¥xml²Ù×÷Àý×Ó
Á˽âÒÔÉÏ»ù±¾ÖªÊ¶Ö®ºó£¬¾ÍÄܽøÐÐһЩ¼òµ¥µÄxml²Ù×÷ÁË¡£µ±È»£¬»¹Ã»ÓÐÉæ¼°µ½ÄÚÂëת»»£¨Ê¹µÃxmlÖÐÄÜ´¦ÀíÖÐÎÄ£©¡¢xpathµÈ½Ï¸´ÔӵIJÙ×÷¡£
3.1 ´´½¨xmlÎļþ
ÓÐÁËÉÏÃæµÄ»ù´¡£¬´´½¨Ò»¸öxmlÎļþÏԵ÷dz£¼òµ¥£¬ÆäÁ÷³ÌÈçÏ£º
l ÓÃxmlNewDocº¯Êý´´½¨Ò»¸öÎļþÖ¸Õëdoc£»
l ÓÃxmlNewNodeº¯Êý´´½¨Ò»¸ö½ÚµãÖ¸Õëroot_node£»
l ÓÃxmlDocSetRootElement½«root_nodeÉèÖÃΪdocµÄ¸ù½áµã£»
l ¸øroot_nodeÌí¼ÓһϵÁеÄ×ӽڵ㣬²¢ÉèÖÃ×Ó½ÚµãµÄÄÚÈݺÍÊôÐÔ£»
l ÓÃxmlSaveFile½«xmlÎļþ´æÈëÎļþ£»
l ÓÃxmlFreeDocº¯Êý¹Ø±ÕÎļþÖ¸Õ룬²¢Çå³ý±¾ÎļþÖÐËùÓнڵ㶯̬ÉêÇëµÄÄÚ´æ¡£
×¢Ò⣬ÓжàÖÖ·½Ê½ÄÜÌí¼Ó×ӽڵ㣺µÚÒ»ÊÇÓÃxmlNewTextChildÖ±½ÓÌí¼ÓÒ»¸öÎı¾×ӽڵ㣻µÚ¶þÊÇÏÈ´´½¨Ð½ڵ㣬ȻºóÓÃxmlAddChild½«Ð½ڵã¼ÓÈëÉϲã½Úµã¡£
ÔʼÂëÎļþÊÇCreateXmlFile.cpp£¬ÈçÏ£º
/********************************************************************
created: 2007/11/09
created: 9:11:2007 15:34
filename: CreateXmlFile.cpp
author: Wang xuebin
depend: libxml2.lib
build: nmake TARGET_NAME=CreateXmlFile
purpose: ´´½¨Ò»¸öxmlÎļþ
*********************************************************************/
#include
#include
#include
#include
int main()
{
//¶¨ÒåÎļþºÍ½ÚµãÖ¸Õë
xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");
xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"root");
//ÉèÖøù½Úµã
xmlDocSetRootElement(doc,root_node);
//ÔÚ¸ù½ÚµãÖÐÖ±½Ó´´½¨½Úµã
xmlNewTextChild(root_node, NULL, BAD_CAST "newNode1", BAD_CAST "newNode1 content");
xmlNewTextChild(root_node, NULL, BAD_CAST "newNode2", BAD_CAST "newNode2 content");
xmlNewTextChild(root_node, NULL, BAD_CAST "newNode3", BAD_CAST "newNode3 content");
//´´½¨Ò»¸ö½Úµã£¬ÉèÖÃÆäÄÚÈݺÍÊôÐÔ£¬È»ºó¼ÓÈë¸ù½áµã
xmlNodePtr node = xmlNewNode(NULL,BAD_CAST"node2");
xmlNodePtr content = xmlNewText(BAD_CAST"NODE CONTENT");
xmlAddChild(root_node,node);
xmlAddChild(node,content);
xmlNewProp(node,BAD_CAST"attribute",BAD_CAST "yes");
//´´½¨Ò»¸ö¶ù×ÓºÍËï×Ó½Úµã
node = xmlNewNode(NULL, BAD_CAST "son");
xmlAddChild(root_node,node);
xmlNodePtr grandson = xmlNewNode(NULL, BAD_CAST "grandson");
xmlAddChild(node,grandson);
xmlAddChild(grandson, xmlNewText(BAD_CAST "This is a grandson node"));
//´æ´¢xmlÎļþ
int nRel = xmlSaveFile("CreatedXml.xml",doc);
if (nRel != -1)
{
coutÒ»¸öxmlÎļþ±»´´½¨,дÈë"¸ö×Ö½Ú" }
//ÊÍ·ÅÎļþÄڽڵ㶯̬ÉêÇëµÄÄÚ´æ
xmlFreeDoc(doc);
return 1;
}
±àÒëÁ´½ÓÃüÁîÈçÏ£º
nmake TARGET_NAME=CreateXmlFile
È»ºóÖ´ÐпÉÖ´ÐÐÎļþCreateXmlFile.exe£¬»áÉú³ÉÒ»¸öxmlÎļþCreatedXml.xml£¬´ò¿ªºóÈçÏÂËùʾ£º
root>
newNode1>newNode1 contentnewNode1>
newNode2>newNode2 contentnewNode2>
newNode3>newNode3 contentnewNode3>
node2 attribute="yes">NODE CONTENTnode2>
son>
grandson>This is a grandson nodegrandson>
son>
root>
×î¼ÑʹÓÃÀàËÆXMLSPYÕâÑùµÄ¹¤¾ß´ò¿ª£¬ÒòΪÕâЩ¹¤¾ßÄÜ×Ô¶¯ÕûÀíxmlÎļþµÄÕ¤¸ñ£¬·ñÔò·Ç³£ÓпÉÄÜÊÇûÓÐËùÓл»ÐеÄÒ»¸öxmlÎļþ£¬¿É¶ÁÐԽϲ
3.2 ½âÎöxmlÎļþ
½âÎöÒ»¸öxmlÎļþ£¬´ÓÖÐÈ¡³öÏëÒªµÄÐÅÏ¢£¬ÀýÈç½ÚµãÖаüº¬µÄÎÄ×Ö£¬»òij¸ö½ÚµãµÄÊôÐÔ£¬ÆäÁ÷³ÌÈçÏ£º
l ÓÃxmlReadFileº¯Êý¶Á³öÒ»¸öÎļþÖ¸Õëdoc£»
l ÓÃxmlDocGetRootElementº¯ÊýµÃµ½¸ù½ÚµãcurNode£»
l curNode->xmlChildrenNode¾ÍÊǸù½ÚµãµÄ×ӽڵ㼯ºÏ£»
l ÂÖѯ×ӽڵ㼯ºÏ£¬ÕÒµ½ËùÐèµÄ½Úµã£¬ÓÃxmlNodeGetContentÈ¡³öÆäÄÚÈÝ£»
l ÓÃxmlHasProp²éÕÒº¬ÓÐij¸öÊôÐԵĽڵ㣻
l È¡³ö¸Ã½ÚµãµÄÊôÐÔ¼¯ºÏ£¬ÓÃxmlGetPropÈ¡³öÆäÊôÐÔÖµ£»
l ÓÃxmlFreeDocº¯Êý¹Ø±ÕÎļþÖ¸Õ룬²¢Çå³ý±¾ÎļþÖÐËùÓнڵ㶯̬ÉêÇëµÄÄÚ´æ¡£
×¢Ò⣺½ÚµãÁбíµÄÖ¸ÕëÒÀÈ»ÊÇxmlNodePtr£¬ÊôÐÔÁбíµÄÖ¸ÕëÒ²ÊÇxmlAttrPtr£¬²¢Ã»ÓÐxmlNodeList»òxmlAttrListÕâÑùµÄÀàÐÍ¡£¿´×÷ÁбíµÄʱºòʹÓÃËûÃǵÄnextºÍprevÁ´±íÖ¸ÕëÀ´½øÐÐÂÖѯ¡£Ö»ÓÐÔÚXpathÖÐÓÐxmlNodeSetÕâÖÖÀàÐÍ£¬ÆäʹÓ÷½·¨Ç°ÃæÒѽéÉÜÁË¡£
ÔʼÂëÈçÏ£ºParseXmlFile.cpp
/********************************************************************
created: 2007/11/15
created: 15:11:2007 11:47
filename: ParseXmlFile.cpp
author: Wang xuebin
depend: libxml2.lib
build: nmake TARGET_NAME=ParseXmlFile
purpose: ½âÎöxmlÎļþ
*********************************************************************/
#include
#include
int main(int argc, char* argv[])
{
xmlDocPtr doc; //¶¨Òå½âÎöÎļþÖ¸Õë
xmlNodePtr curNode; //¶¨Òå½áµãÖ¸Õë(ÄãÐèÒªËûΪÁËÔÚ¸÷¸ö½áµã¼äÒÆ¶¯)
xmlChar *szKey; //ÁÙʱ×Ö·û´®±äÁ¿
char *szDocName;
if (argc {
printf("Usage: %s docname"n", argv[0]);
return(0);
}
szDocName = argv[1];
doc = xmlReadFile(szDocName,"GB2312",XML_PARSE_RECOVER); //½âÎöÎļþ
//¼ì²é½âÎöÎļþÊÇ·ñ³É¹¦£¬Èç¹û²»³É¹¦£¬libxml½«Ö¸Ò»¸ö×¢²áµÄ´íÎó²¢Í£Ö¹¡£
//Ò»¸ö³£¼û´íÎóÊDz»Êʵ±µÄ±àÂë¡£XML±ê×¼Îļþ³ýÁËÓÃUTF-8»òUTF-16Í⻹¿ÉÓÃÆäËû±àÂë±£´æ¡£
//Èç¹ûÎļþÊÇÕâÑù£¬libxml½«×Ô¶¯µØÎªÄãת»»µ½UTF-8¡£¸ü¶à¹ØÓÚXML±àÂëÐÅÏ¢°üº¬ÔÚXML±ê×¼ÖÐ.
if (NULL == doc)
{
fprintf(stderr,"Document not parsed successfully. "n");
return -1;
}
curNode = xmlDocGetRootElement(doc); //È·¶¨Îļþ¸ùÔªËØ
/*¼ì²éÈ·Èϵ±Ç°ÎļþÖаüº¬ÄÚÈÝ*/
if (NULL == curNode)
{
fprintf(stderr,"empty document"n");
xmlFreeDoc(doc);
return -1;
}
/*ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒÃÇÐèҪȷÈÏÎļþÊÇÕýÈ·µÄÀàÐÍ¡£¡°root¡±ÊÇÔÚÕâ¸öʾÀýÖÐʹÓÃÎļþµÄ¸ùÀàÐÍ¡£*/
if (xmlStrcmp(curNode->name, BAD_CAST "root"))
{
fprintf(stderr,"document of the wrong type, root node != root");
xmlFreeDoc(doc);
return -1;
}
curNode = curNode->xmlChildrenNode;
xmlNodePtr propNodePtr = curNode;
while(curNode != NULL)
{
//È¡³ö½ÚµãÖеÄÄÚÈÝ
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"newNode1")))
{
szKey = xmlNodeGetContent(curNode);
printf("newNode1: %s"n", szKey);
xmlFree(szKey);
}
//²éÕÒ´øÓÐÊôÐÔattributeµÄ½Úµã
if (xmlHasProp(curNode,BAD_CAST "attribute"))
{
propNodePtr = curNode;
}
curNode = curNode->next;
}
//²éÕÒÊôÐÔ
xmlAttrPtr attrPtr = propNodePtr->properties;
while (attrPtr != NULL)
{
if (!xmlStrcmp(attrPtr->name, BAD_CAST "attribute"))
{
xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "attribute");
cout xmlFree(szAttr);
}
attrPtr = attrPtr->next;
}
xmlFreeDoc(doc);
return 0;
}
±àÒëÁ´½ÓÃüÁîÈçÏ£º
nmake TARGET_NAME=ParseXmlFile
Ö´ÐÐÃüÁîÈçÏ£¬Ê¹ÓõÚÒ»´Î´´½¨µÄxmlÎļþ×÷ΪÊäÈ룺
ParseXmlFile.exe CreatedXml.xml
¹Û²ìÔʼÂë¿É·¢ÏÖ£¬ËùÓÐÒÔ²éѯ·½Ê½µÃµ½µÄxmlChar*×Ö·û´®¶¼±ØÐëʹÓÃxmlFreeº¯ÊýÊÖ¶¯ÊÍ·Å¡£·ñÔò»áÔì³ÉÄÚ´æÐ¹Â©¡£
3.3 ÐÞ¸ÄxmlÎļþ
ÓÐÁËÉÏÃæµÄ»ù´¡£¬ÐÞ¸ÄxmlÎļþµÄÄÚÈݾͷdz£¼òµ¥ÁË¡£Ê×ÏÈ´ò¿ªÒ»¸öÒÑ´æÔÚµÄxmlÎļþ£¬Ë³×Ÿù½áµãÕÒµ½ÐèÒªÌí¼Ó¡¢É¾³ý¡¢Ð޸ĵĵط½£¬µ÷ÓÃÏàÓ¦µÄxmlº¯Êý¶Ô½Úµã½øÐÐÔö¡¢É¾¡¢¸Ä²Ù×÷¡£ÔʼÂë¼ûChangeXmlFile£¬±àÒëÁ´½Ó·½·¨ÈçÉÏ¡£Ö´ÐÐÏÂÃæµÄÃüÁ
ChangeXmlFile.exe CreatedXml.xml
Äܵõ½Ò»¸öÐ޸ĺóµÄxmlÎļþChangedXml.xml£¬ÈçÏ£º
root>
newNode2>content changednewNode2>
newNode3 newAttr="YES">newNode3 contentnewNode3>
node2 attribute="no">NODE CONTENTnode2>
son>
grandson>This is a grandson nodegrandson>
newGrandSon>new contentnewGrandSon>
son>
root>
ÐèҪעÒâµÄÊÇ£¬²¢Ã»ÓÐxmlDelNode»òxmlRemoveNodeº¯Êý£¬ÎÒÃÇɾ³ý½ÚµãʹÓõÄÊÇÒÔÏÂÒ»¶Î´úÂ룺
if (!xmlStrcmp(curNode->name, BAD_CAST "newNode1"))
{
xmlNodePtr tempNode;
tempNode = curNode->next;
xmlUnlinkNode(curNode);
xmlFreeNode(curNode);
curNode = tempNode;
continue;
}
¼´½«µ±Ç°½Úµã´ÓÎļþÖжÏÁ´£¨unlink£©£¬ÕâÑù±¾Îļþ¾Í²»»áÔÙ°üº¬Õâ¸ö×ӽڵ㡣ÕâÑù×öÐèҪʹÓÃÒ»¸öÁÙʱ±äÁ¿À´´æ´¢¶ÏÁ´½ÚµãµÄºóÐø½Úµã£¬²¢¼ÇµÃÒªÊÖ¶¯É¾³ý¶ÏÁ´½ÚµãµÄÄÚ´æ¡£
3.4 ʹÓÃXPATH²éÕÒxmlÎļþ
¼ò¶øÑÔÖ®£¬XPATHÖ®ÓÚxml£¬ºÃ±ÈSQLÖ®ÓÚ¹ØÏµÊý¾Ý¿â¡£ÒªÔÚÒ»¸ö¸´ÔÓµÄxmlÎļþÖвéÕÒËùÐèµÄÐÅÏ¢£¬XPATH¼òÖ±ÊDZز»¿ÉÉٵŤ¾ß¡£XPATHÓï·¨¼òµ¥Ò×ѧ£¬²¢ÇÒÓÐÒ»¸ö·Ç³£ºÃµÄ¹Ù·½½Ì³Ì£¬¼û
http://www.zvon.org/xxl/XPathTutorial/Output_chi/introduction.html
¡£Õâ¸öÕ¾µãµÄXML¸÷ÖÖ½Ì³ÌÆëÈ«£¬²¢ÇÒÓаüÀ¨ÖÐÎÄÔÚÄڵĸ÷¹úÓïÑÔ°æ±¾£¬ÕæÊÇÈÃÎÒϲ»¶µ½·Ç³££¡
ʹÓÃXPATH֮ǰ£¬±ØÐëÊ×ÏÈÊìϤ¼¸¸öÊý¾ÝÀàÐͺͺ¯Êý£¬ËûÃÇÊÇʹÓÃXPATHµÄǰÌá¡£ÔÚlibxml2ÖÐʹÓÃXpathÊǷdz£¼òµ¥µÄ£¬ÆäÁ÷³ÌÈçÏ£º
l ¶¨ÒåÒ»¸öXPATHÉÏÏÂÎÄÖ¸ÕëxmlXPathContextPtr context£¬²¢ÇÒʹÓÃxmlXPathNewContextº¯ÊýÀ´³õʼ»¯Õâ¸öÖ¸Õ룻
l ¶¨ÒåÒ»¸öXPATH¶ÔÏóÖ¸ÕëxmlXPathObjectPtr result£¬²¢ÇÒʹÓÃxmlXPathEvalExpressionº¯ÊýÀ´¼ÆËãXpath±í´ïʽ£¬µÃµ½²éѯ½á¹û£¬½«½á¹û´æÈë¶ÔÏóÖ¸ÕëÖУ»
l ʹÓÃresult->nodesetvalµÃµ½½Úµã¼¯ºÏÖ¸Õ룬ÆäÖаüº¬ÁËËùÓзûºÏXpath²éѯ½á¹ûµÄ½Úµã£»
l ʹÓÃxmlXPathFreeContextÊÍ·ÅÉÏÏÂÎÄÖ¸Õ룻
l ʹÓÃxmlXPathFreeObjectÊÍ·ÅXpath¶ÔÏóÖ¸Õ룻
¾ßÌåµÄʹÓ÷½·¨ÄÜ¿´XpathForXmlFile.cppµÄÕâÒ»¶Î´úÂ룬Æä¹¦ÄÜÊDzéÕÒ·ûºÏij¸öXpathÓï¾äµÄ¶ÔÏóÖ¸Õ룺
xmlXPathObjectPtr getNodeSet(xmlDocPtr doc, const xmlChar *szXpath)
{
xmlXPathContextPtr context; //XPATHÉÏÏÂÎÄÖ¸Õë
xmlXPathObjectPtr result; //XPATH¶ÔÏóÖ¸Õ룬ÓÃÀ´´æ´¢²éѯ½á¹û
context = xmlXPathNewContext(doc); //´´½¨Ò»¸öXPathÉÏÏÂÎÄÖ¸Õë
if (context == NULL)
{
printf("context is NULL"n");
return NULL;
}
result = xmlXPathEvalExpression(szXpath, context); //²éѯXPath±í´ïʽ£¬µÃµ½Ò»¸ö²éѯ½á¹û
xmlXPathFreeContext(context); //ÊÍ·ÅÉÏÏÂÎÄÖ¸Õë
if (result == NULL)
{
printf("xmlXPathEvalExpression return NULL"n");
return NULL;
}
if (xmlXPathNodeSetIsEmpty(result->nodesetval)) //¼ì²é²éѯ½á¹ûÊÇ·ñΪ¿Õ
{
xmlXPathFreeObject(result);
printf("nodeset is empty"n");
return NULL;
}
return result;
}
Ò»¸öÍêÕûµÄʹÓÃXpathµÄÀý×ÓÔÚ´úÂëXpathForXmlFile.cppÖУ¬Ëû²éÕÒÒ»¸öxmlÎļþÖзûºÏ"/root/node2[@attribute=¡¯yes¡¯]"Óï¾äµÄ½á¹û£¬²¢ÇÒ½«ÕÒµ½µÄ½ÚµãµÄÊôÐÔºÍÄÚÈÝ´òÓ¡³öÀ´¡£±àÒëÁ´½ÓÃüÁîÈçÏ£º
nmake TARGET_NAME=XpathForXmlFile
Ö´Ðз½Ê½ÈçÏ£º
XpathForXmlFile.exe CreatedXml.xml
¹Û²ì½á¹ûÄÜ¿´³öÕÒµ½ÁËÒ»¸ö½Úµã£¬¼´rootÏÂÃænode2½Úµã£¬ËûµÄattributeÊôÐÔÖµÕýºÃµÈÓÚyes¡£¸ü¶à¹ØÓÚXpathµÄÄÚÈÝÄܲο¼XPATH¹Ù·½ÊֲᡣֻÓÐÕÆ¿ØÁËXPATH£¬²ÅÕÆ¿ØÁËʹÓôóÐÍXMLÎļþµÄ·½·¨£¬·ñÔòÿѰÕÒÒ»¸ö½Úµã¶¼Òª´Ó¸ù½ÚµãÕÒÆð£¬»á°ÑÈËÀÛËÀ¡£
4. ÓÃICONV½â¾öXMLÖеÄÖÐÎÄÎÊÌâ
Libxml2ÖÐĬÈϵÄÄÚÂëÊÇUTF-8£¬ËùÓÐʹÓÃlibxml2½øÐд¦ÀíµÄxmlÎļþ£¬±ØÐëÊ×ÏÈÏÔʽ»òĬÈϵÄת»»ÎªUTF-8±àÂë²ÅÄܱ»´¦Àí¡£
ÒªÔÚxmlÖÐʹÓÃÖÐÎÄ£¬¾Í±ØÐëÄܹ»ÔÚUTF-8ºÍGB2312ÄÚÂ루½Ï³£ÓõÄÒ»ÖÖ¼òÌåÖÐÎıàÂ룩֮¼ä½øÐÐת»»¡£Libxml2ÌṩÁËĬÈϵÄÄÚÂëת»»»úÖÆ£¬²¢ÇÒÔÚlibxml2µÄTutorialÖÐÓÐÒ»¸öÀý×Ó£¬ÊÂʵ֤ʵÕâ¸öÀý×Ó²¢²»ÊʺÏÓÃÀ´×ª»»ÖÐÎÄ¡£
ËùÒÔÐèÒªÎÒÃÇÏÔʽµÄʹÓÃICONVÀ´½øÐÐÄÚÂëת»»£¬libxml2±¾ÉíÒ²ÊÇʹÓÃICONV½øÐÐת»»µÄ¡£ICONVÊǸöרÃÅÓÃÀ´½øÐбàÂëת»»µÄ¿â£¬»ù±¾ÉÏÖ§³ÖĿǰËùÓг£ÓõıàÂë¡£ËûÊÇglibc¿âµÄÒ»¸ö²¿·Ö£¬³£³£±»ÓÃÓÚUNIXϵͳÖС£µ±È»£¬ÔÚwindowsÏÂÃæÊ¹ÓÃҲûÓÐËùÓÐÎÊÌâ¡£Ç°ÃæÒÑÌáµ½ÁËICONVµÄ°²×°ºÍʹÓ÷½·¨£¬ÕâÀïÖ÷Òª½²Ò»Ï±à³ÌÏà¹ØÎÊÌâ¡£
±¾½ÚÆäʵºÍxml¼°libxml2ûÓÐÌ«´ó¹ØÏµ£¬ÄãÄܰÑËû¼òµ¥¿´×÷ÊǸö±àÂëת»»·½ÃæµÄרÌâ¡£ÎÒÃǽö½öÐèҪѧ»áʹÓÃÁ½¸öº¯Êý¾ÍÄÜÁË£¬¼´´ÓUTF-8ת»»µ½GB2312µÄº¯Êýu2g£¬¼°·´Ïòת»»µÄº¯Êýg2u£¬ÔʼÂëÔÚwxb_codeConv.cÖУº
/********************************************************************
created: 2007/11/15
created: 15:11:2007 10:30
filename: wxb_codeConv.c
author: Wang xuebin
depend: iconv.lib
build: ²»±Øbuild£¬±»°üº¬µ½ÆäËûÔʼÂëÖÐ
purpose: Ìṩ´ÓUTF-8µ½GB2312µÄÄÚÂëת»»£¬¼°·´ÏòµÄת»»
*********************************************************************/
#include "iconv.h"
#include
//´úÂëת»»:´ÓÒ»ÖÖ±àÂëתΪÁíÒ»ÖÖ±àÂë
int code_convert(char* from_charset, char* to_charset, char* inbuf,
int inlen, char* outbuf, int outlen)
{
iconv_t cd;
char** pin = &inbuf;
char** pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if(cd == 0)
return -1;
memset(outbuf,0,outlen);
if(iconv(cd,(const char**)pin,(unsigned int *)&inlen,pout,(unsigned int*)&outlen)
== -1)
return -1;
iconv_close(cd);
return 0;
}
//UNICODEÂëתΪGB2312Âë
//³É¹¦Ôò·µ»ØÒ»¸ö¶¯Ì¬·ÖÅäµÄchar*±äÁ¿£¬ÐèÒªÔÚʹÓÃÍê±ÏºóÊÖ¶¯free£¬Ê§°Ü·µ»ØNULL
char* u2g(char *inbuf)
{
int nOutLen = 2 * strlen(inbuf) - 1;
char* szOut = (char*)malloc(nOutLen);
if (-1 == code_convert("utf-8","gb2312",inbuf,strlen(inbuf),szOut,nOutLen))
{
free(szOut);
szOut = NULL;
}
return szOut;
}
//GB2312ÂëתΪUNICODEÂë
//³É¹¦Ôò·µ»ØÒ»¸ö¶¯Ì¬·ÖÅäµÄchar*±äÁ¿£¬ÐèÒªÔÚʹÓÃÍê±ÏºóÊÖ¶¯free£¬Ê§°Ü·µ»ØNULL
char* g2u(char *inbuf)
{
int nOutLen = 2 * strlen(inbuf) - 1;
char* szOut = (char*)malloc(nOutLen);
if (-1 == code_convert("gb2312","utf-8",inbuf,strlen(inbuf),szOut,nOutLen))
{
free(szOut);
szOut = NULL;
}
return szOut;
}
ʹÓõÄʱºò½«Õâ¸öcÎļþincludeµ½ÆäËûÔ´ÎļþÖС£includeÒ»¸öcÎļþ²¢²»Ææ¹Ö£¬ÔÚcÓïÑÔµÄÄê´úÎÒÃdz£³£Õâô¸É£¬Î¨Ò»µÄº¦´¦µÄ±àÒëÁ´½Ó³öÀ´µÄ¿ÉÖ´ÐгÌʽÌå»ý±ä´óÁË¡£µ±È»ÕâʱÒòΪÎÒÃÇÕâ¶Î´úÂë·Ç³£Ð¡µÄÔÒò£¬ÔÙ´óÒ»µãÎÒ¾ÍÒªÓÃdllÁË¡£
´ÓUTF-8µ½GB2312µÄÒ»¸öµäÐÍʹÓÃÁ÷³ÌÈçÏ£º
l µÃµ½Ò»¸öUTF-8µÄ×Ö·û´®szSrc£»
l ¶¨ÒåÒ»¸öchar*µÄ×Ö·ûÖ¸ÕëszDes£¬²¢²»±Ø¸øËû¶¯Ì¬ÉóÅÐÄڴ棻
l szDes = u2g(szSrc)£¬ÕâÑù¾ÍÄܵõ½×ª»»ºóµÄGB2312±àÂëµÄ×Ö·û´®£»
l ʹÓÃÍêÕâ¸ö×Ö·û´®ºóʹÓÃfree(szDes)À´ÊÍ·ÅÄÚ´æ¡£
±¾ÎIJ¢²»×¼±¸½²ÊöiconvÖеĺ¯Êýϸ½Ú£¬ÒòΪÄǼ¸¸öº¯Êý¼°Êý¾ÝÀàÐͶ¼·Ç³£¼òµ¥£¬ÎÒÃÇ»¹ÊÇÖØµã¿´Ò»ÏÂÔõôÔÚlibxml2ÖÐʹÓñàÂëת»»À´´¦Àí´øÓÐÖÐÎĵÄxmlÎļþ¡£ÏÂÃæÊÇʹÓÃÒÔÉÏ·½·¨À´´´½¨Ò»¸ö´øÓÐÖÐÎĵÄXMLÎļþµÄÀý×Ó³ÌʽCreateXmlFile_cn.cpp£¬ÔʼÂëÈçÏ£º
/********************************************************************
created: 2007/11/17
created: 9:11:2007 15:34
filename: CreateXmlFile.cpp
author: Wang xuebin
depend: libxml2.lib iconv.lib
build: nmake TARGET_NAME=CreateXmlFile_cn
purpose: ´´½¨Ò»¸öxmlÎļþ£¬ÆäÖаüº¬ÖÐÎÄ
*********************************************************************/
#include
#include
#include
#include
#include "wxb_codeConv.c" //×Ô¼ºÐ´µÄ±àÂëת»»º¯Êý
int main(int argc, char **argv)
{
//¶¨ÒåÎļþºÍ½ÚµãÖ¸Õë
xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");
xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"root");
//ÉèÖøù½Úµã
xmlDocSetRootElement(doc,root_node);
//Ò»¸öÖÐÎÄ×Ö·û´®×ª»»ÎªUTF-8×Ö·û´®£¬È»ºóдÈë
char* szOut = g2u("½Úµã1µÄÄÚÈÝ");
//ÔÚ¸ù½ÚµãÖÐÖ±½Ó´´½¨½Úµã
xmlNewTextChild(root_node, NULL, BAD_CAST "newNode1", BAD_CAST "newNode1 content");
xmlNewTextChild(root_node, NULL, BAD_CAST "newNode2", BAD_CAST "newNode2 content");
xmlNewTextChild(root_node, NULL, BAD_CAST "newNode3", BAD_CAST "newNode3 content");
xmlNewChild(root_node, NULL, BAD_CAST "node1",BAD_CAST szOut);
free(szOut);
//´´½¨Ò»¸ö½Úµã£¬ÉèÖÃÆäÄÚÈݺÍÊôÐÔ£¬È»ºó¼ÓÈë¸ù½áµã
xmlNodePtr node = xmlNewNode(NULL,BAD_CAST"node2");
xmlNodePtr content = xmlNewText(BAD_CAST"NODE CONTENT");
xmlAddChild(root_node,node);
xmlAddChild(node,content);
szOut = g2u("ÊôÐÔÖµ");
xmlNewProp(node,BAD_CAST"attribute",BAD_CAST szOut);
free(szOut);
//´´½¨Ò»¸öÖÐÎĽڵã
szOut = g2u("ÖÐÎĽڵã");
xmlNewChild(root_node, NULL, BAD_CAST szOut,BAD_CAST "content of chinese node");
free(szOut);
//´æ´¢xmlÎļþ
int nRel = xmlSaveFormatFileEnc("CreatedXml_cn.xml",doc,"GB2312",1);
if (nRel != -1)
{
coutÒ»¸öxmlÎļþ±»´´½¨,дÈë"¸ö×Ö½Ú" }
xmlFreeDoc(doc);
return 1;
}
±àÒëÁ´½ÓÃüÁîÈçÏ£º
nmake TARGET_NAME=CreateXmlFile_cn
Íê³ÉºóÖ´ÐÐCreateXmlFile_cn.exeÄÜÉú³ÉÒ»¸öxmlÎļþCreatedXml_cn.xml£¬ÆäÄÚÈÝÈçÏ£º
root>
newNode1>newNode1 contentnewNode1>
newNode2>newNode2 contentnewNode2>
newNode3>newNode3 contentnewNode3>
node1>½Úµã1µÄÄÚÈÝnode1>
node2 attribute="ÊôÐÔÖµ">NODE CONTENTnode2>
ÖÐÎĽڵã>content of chinese nodeÖÐÎĽڵã>
root>
¹Û²ì¿ÉÖª£¬½ÚµãµÄÃû³Æ¡¢ÄÚÈÝ¡¢ÊôÐÔ¶¼ÄÜʹÓÃÖÐÎÄÁË¡£ÔÚ½âÎö¡¢Ð޸ĺͲéÕÒXMLÎļþʱ¶¼ÄÜʹÓÃÉÏÃæµÄ·½·¨£¬Ö»Òª¼Çס£¬½øÈëxmlÎļþ֮ǰ½«ÖÐÎıàÂëת»»ÎªUTF-8±àÂ룻´ÓXMLÖÐÈ¡³öÊý¾Ýʱ£¬²»¹ÜÈýÆß¶þʮһ¶¼ÄÜת»»ÎªGB2312ÔÙÓ㬷ñÔòÄã·Ç³£ÓпÉÄܼûµ½´«ËµÖеÄÂÒÂ룡
5. ÓÃXMLÀ´×öµãʲô
ÓÐÁËÒÔÉϵĻù´¡£¬ÏàÐÅÒÑÄÜ˳ÀûµÄÔÚc/c++³ÌʽÖÐʹÓÃXMLÎļþÁË¡£ÄÇô£¬ÎÒÃǵ½µ×ÒªÓÃXMLÀ´×öÊ²Ã´ÄØ£¿ÎÒËæ±ã˵һ˵×Ô¼ºµÄÏë·¨£º
µÚÒ»£¬ÄÜÓÃÀ´×÷ΪÉèÖÃÎļþ¡£ÀýÈç·Ç³£¶à×é¼þ¾ÍÊÇÓÃXMLÀ´×öÉèÖÃÎļþ£»µ±È»£¬ÎÒÃÇÖªµÀÓÃINI×öÉèÖÃÎļþ¸ü¼òµ¥£¬Ö»ÒªÊìϤÁ½¸öº¯Êý¾ÍÄÜÁË£»²»¹ý£¬¸´ÔÓÒ»µãµÄÉèÖÃÎļþÎÒ»¹Êǽ¨Òé²ÉÓÃXML£»
µÚ¶þ£¬ÄÜÓÃÀ´×÷ΪÔÚ³Ìʽ֮¼ä´«ËÍÊý¾ÝµÄ¸ñʽ£¬ÕâÑùµÄ»°×î¼Ñ¸øÄãµÄxmlÏȶ¨ÒåÒ»¸öXML Schema£¬ÕâÑùµÄÊý¾ÝÊ×ÏÈÄÜ×öÒ»¸öÁ¼¹¹Ð£Ñ飬»¹ÄÜÀ´Ò»¸öSchemaУÑ飬Èç´ËµÄ»°³ö´íÂÊ»á±ÈûÓиñʽµÄÊý¾ÝСµÃ¶à¡£Ä¿Ç°XMLÒѹ㷺×÷ÎªÍøÂçÖ®¼äµÄÊý¾Ý¸ñʽÁË£»
µÚÈý£¬ÄÜÓÃÀ´×÷ΪÄã×Ô¶¨ÒåµÄÊý¾Ý´æ´¢¸ñʽ£¬ÀýÈç¶ÔÏó³Ö¾Ã»¯Ö®ÀàµÄ¹¦ÄÜ£»
×îºó£¬ÄÜÓÃÀ´ÏÔʾÄãµÄ¼¼Êõ·Ç³£¸ßÉ±¾À´ÄãÒª´æ´¢Ò»¸ö1£¬½á¹ûÄãÕâÑù´æ´¢ÁË£º
root>
My_Program_Code content="1">My_Program_Code>
root>
À´Ô´£ºLinuxÉçÇø