http://jianlee.ylinux.org/Computer/C/libxml.html
需求安装包:libxml2 和libxm2-devel,其中libxml主要包括.so文件,libxml2-devel 包括开发文档和所有的.h文件。可用rpm �Cql 命令查看,rpm �Cqd可查看文档信息。
3.1 数据类型--xmlChar
在libXml中用xmlChar 替代char,XML使用UTF-8编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到UTF-8才能使用libxml的函数。
xmlMalloc 是动态分配内存的函数; xmlFree 是配套的释放内 存函数; xmlStrcmp 是字符串比较函数等等。基本上 xmlChar 字符串相关函数 都在xmlstring.h 中定义;而动态内存分配函数在 xmlmemory.h 中定义。另外要 注意,因为总是要在 xmlChar* 和 char* 之间进行类型转换,所以定义了一个宏 BAD_CAST ,其定义如下: xmlstring.h
#define BAD_CAST (xmlChar *)
代表DOM结构中的除文档类型类型外的其它节点类型。包含单一结点 的结构, xmlNodePtr 是指向这个结构的指针,它被用于遍历文档树。节点应 该是xml中最重要的元素了, xmlNode 代表了xml文档中的一个节点,实现为一 个 struct ,内容很丰富: tree.h
http://jianlee.ylinux.org/Computer/C/libxml.html
xml 文档的操作其根本原理就是在节点之间移动、查询节点的各项信息,并进行 增加、删除、修改的操作。 xmlDocSetRootElement 函数可以将一个节点设置为 某个文档的根节点,这是将文档与节点连接起来的重要手段,当有了根结点以 后,所有子节点就可以依次连接上根节点,从而组织成为一个 xml 树。
创建一个 XML 文档流程如下:
用 xmlNewDoc 函数创建一个文档指针 doc;
用 xmlNewNode 函数创建一个节点指针 root_node;
用 xmlDocSetRootElement 将 root_node 设置为 doc 的根节点;
给 root_node 添加一系列子节点,并设置字节点的内容和属性;
用 xmlSaveFile 保存 xml 到文件;
用 xmlFreeDoc 函数关闭文档指针,清除内存。
xmlNewProp (proot_node, BAD_CAST "版本", BAD_CAST "1.0");
最后显示是这个样子:
<根节点 版本="1.0">
xmlAddChild (pnode1,xmlNewText (BAD_CAST "这是更低的节点,子子子节点1"));
会出现下面的结果:
<子子节点1>这是更低的节点,子子子节点1</子子节点1>
解析一个xml文档,从中取出想要的信息,例如节点中包含的文字,或者某个节点 的属性,其流程如下:
用 xmlReadFile 函数读出一个文档指针 doc ;
用 xmlDocGetRootElement 函数得到根节点 curNode ;
curNode->xmlChildrenNode 就是根节点的子节点集合 ;
轮询子节点集合,找到所需的节点,用 xmlNodeGetContent 取出其内容 ;
用 xmlHasProp 查找含有某个属性的节点 ;
取出该节点的属性集合,用 xmlGetProp 取出其属性值 ;
用 xmlFreeDoc 函数关闭文档指针,并清除本文档中所有节点动态申请的内存。
注意: 节点列表的指针依然是 xmlNodePtr ,属性列表的指针也是 xmlAttrPtr ,并没有 xmlNodeList 或者 xmlAttrList 这样的类型 。看作列表的时候使用它 们的 next 和 prev 链表指针来进行轮询 。只有在 Xpath 中有 xmlNodeSet 这 种类型。
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取 bookstore 元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带有属性的 title 元素。 |
//BBB[@id]
<AAA>
<BBB id = "b1"/>
<BBB id = "b2"/>
<BBB name = "bbb"/>
<BBB/>
</AAA>
XML转义字符
< |
< |
小于号 |
> |
> |
大于号 |
& |
& |
和 |
' |
' |
单引号 |
" |
" |
双引号 |
参考
http://www.w3school.com.cn/xpath/
http://www.zvon.org/xxl/XPathTutorial/Output_chi/example5.html
http://sblig.iteye.com/blog/814323
http://www.blogjava.net/wxb_nudt/archive/2007/11/28/161340.html
//BBB选择所有BBB元素
//BBB[@id]:选择有"id"属性的BBB元素
xmlDocGetRootElement(doc):取得文档根元素