libxml2编译及API,XPath操作总结

本文介绍了在Windows环境下使用VC6编译libxml2库的过程,并详细讲解了libxml2的基本API操作,包括节点类型和结构体,以及XPath的使用示例。通过示例展示了如何获取内容节点、属性节点以及元素的子节点。还提到了一些新增的实用API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手动编译的好处是可以获得最新的头文件及库,下载最新的源代码,以现在的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()只能作用于元素节点。

在线体验:http://www.zvon.org:9001/saxon/cgi-bin/XLab/XML/addressbook.html?stylesheetFile=XSLT/xpath.xslt&lang=eng

 

新增的实用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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值