手动编译的好处是可以获得最新的头文件及库,下载最新的源代码,以现在的2.7.6为例,windows xp+vc6 sp6环境,(vc7,vc8,vc9类似)
进入libxml2-2.7.6/win32/目录下,其实看readme就知道怎么编译了~~(不过cscript运行有小问题,需要加一个参数)
具体过程如下:
1,配置环境,在cmd下,进入到libxml2-2.7.6/win32/下,运行cscript //E:jscript configure.js help,列出帮助。默认参数的话,cscript //E:jscript configure.js include=c:/XXXX/include lib=c:/XXXX/lib,include和lib是头文件和库目录,需要iconv的(zip支持默认是no,打开的话,也要加上zlib的,iconv.dll也要在搜索路径中)。不能有空格(用引号引起来应该可以),嫌麻烦的话,就可以添加到PATH环境变量中去,这样省事。
2. 运行nmake /f Makefile.msvc
我的是在生成XXXtest.exe时错误退出了。不过dll和lib都已经生成好了。
mingw编译见README.
--------------------------------------------------------分割线------------------------------------------------------------------------
基本API操作,google之。
libxml内部处理以UTF-8进行的,xmlReadFile/xmlSaveFormatFileEnc读写文件可以指定特定的编码。在unix下不存在编码问题。都是utf-8。
节点类型:typedef enum {
XML_ELEMENT_NODE= 1,
XML_ATTRIBUTE_NODE= 2,
XML_TEXT_NODE= 3,
XML_CDATA_SECTION_NODE= 4,
XML_ENTITY_REF_NODE= 5,
XML_ENTITY_NODE= 6,
XML_PI_NODE= 7,
XML_COMMENT_NODE= 8,
XML_DOCUMENT_NODE= 9,
XML_DOCUMENT_TYPE_NODE= 10,
XML_DOCUMENT_FRAG_NODE= 11,
XML_NOTATION_NODE= 12,
XML_HTML_DOCUMENT_NODE= 13,
XML_DTD_NODE= 14,
XML_ELEMENT_DECL= 15,
XML_ATTRIBUTE_DECL= 16,
XML_ENTITY_DECL= 17,
XML_NAMESPACE_DECL= 18,
XML_XINCLUDE_START= 19,
XML_XINCLUDE_END= 20
#ifdef LIBXML_DOCB_ENABLED
,XML_DOCB_DOCUMENT_NODE= 21
#endif
} xmlElementType;
节点结构体:
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 */
};
例子:
<A att="type">string</A>
element节点的name为A,properties为属性节点链表头,只有一个att 节点,类型为XML_ATTRIBUTE_NODE,此att节点的children是content为"type"的XML_TEXT_NODE;元素节点的children是content为"string"的XML_TEXT_NODE,
在读入一个XML文件时,在element节点的next中多插入了一个节点,XML_TEXT_NODE,其实是由文件中element节点后的回车0A(空格等)生成的。
XPATH应用:(教程: http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html )
获取content节点, /A/B/text()
xmlXPathCastNodeToString()
获取属性节点, /A/B/@B_attr
元素的子节点(descendant)不包括属性节点和content节点,但是属性节点和content节点的父节点(ancestor)是元素节点。与JS中DOM有区别。
xml文件:
<addressBook >
<address >
<firstName >John </firstName >
<surname >Smith </surname >
<email >smithj@world.org </email >
<tel type = "work" >234-123-222 </tel >
</address >
<address >
<firstName >Alice </firstName >
<surname >Brown </surname >
<email >Alice.Brown@europe.com </email >
<tel type = "home" >22-33-444 </tel >
<tel type = "work" >11-43-222 </tel >
</address >
<address >
<firstName >George </firstName >
<surname >White </surname >
<email >gw@rock.com </email >
</address >
</addressBook >
xpath例:
//firstName[./text()='John']
//*[@type='home']
name()只能作用于元素节点。
新增的实用API: (详细参考见tree.h)
XMLPUBFUN unsigned long XMLCALL
xmlChildElementCount (xmlNodePtr parent);
XMLPUBFUN xmlNodePtr XMLCALL
xmlNextElementSibling (xmlNodePtr node);
XMLPUBFUN xmlNodePtr XMLCALL
xmlFirstElementChild (xmlNodePtr parent);
XMLPUBFUN xmlNodePtr XMLCALL
xmlLastElementChild (xmlNodePtr parent);
XMLPUBFUN xmlNodePtr XMLCALL
xmlPreviousElementSibling (xmlNodePtr node);
faicker
2009-10-15