嵌入式linux开发:[1]XML解析
1、1.1.1 协议概述
采用网络上开源的Cmarkup类来解析XML协议,因为Cmarkup使用起来方便、简单。Cmarkup具备了所有对XML的操作,只要调用所提供的方法就可以了。最新版下载网站:http://www.firstobject.com/dn_markup.htm
2、1.1.1 XML描述
XML 文档形成一种树结构XML 文档必须包含根元素。该元素是所有其他元素的父元素。
XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。
上图表示下面的 XML 中的一本书:
<bookstore>
<book category="COOKING">
<titlelang="en">Everyday Italian</title>
<author>Giada DeLaurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<titlelang="en">Harry Potter</title>
<author>J K.Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<titlelang="en">Learning XML</title>
<author>Erik T.Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
3、1.1.1 XML语法
推荐学习网站http://www.w3school.com.cn/xml/xml_syntax.asp
一个合格xml的语法要求
1)文档的开始必须是XML声明。
2)含有数据的元素必须有起始标记和结束标记。
即:<tag>xxx</tag>
3)不含数据并且仅使用一个标记的元素必须以/>结束。
即:<tag/>
也可以使用<tag></tag>,但是不推荐.
不可以使用<tag>
4)文档只能包含一个能够包含全部其他元素的元素。
即:合格的XML文档必须有且只有一个根元素
5)元素只能嵌套不能重叠。
eg:不合法的嵌套例子:<b><i>Thistext is bold and italic</b></i>
6)属性值必须加引号。
eg: <tag key="value" />value要用双引号括起来
7)字符<和&只能用于起始标记和实体引用。
8)xml对大小写敏感
4、1.1.1 函数参考
下面是CMarkup的类成员函数列表。这些函数的设计都是基于源EDOM的。
1)初始化
Load 从一个(xml)文件构建CMarkup对象并对其进行解析。
SetDoc 从一个字符串构建CMarkup对象并对其进行解析。 xml.SetDoc("xml version=\"1.0\"encoding=\"UTF-8\"?>\r\n");
2)输出
Save 把xml文档数据写到文件中。
GetDoc 将整个xml文档数据作为一个字符串返回。
3)改变当前位置
FindElem 定位到下一个元素,可以选择匹配标签名或者路径。
FindChildElem 定位到下一个子元素,可以选择匹配标签名或者路径。
FindNode 定位到下一个节点,可选择匹配节点类型。
IntoElem 进入当前位置的下一级位置,而当前位置则变为父位置。
OutOfElem 使当前位置的父位置变为当前位置。
ResetPos 复位当前位置为文档的起始位置,到XML第一行的位置,需要使用FindChildElem函数后才可以使用其他函数,暂时测试如此。
ResetMainPos 复位当前位置为第一个兄弟位置之前。
ResetChilePos 复位当前的子位置为第一个子位置之前。
4)添加元素
AddElem 在当前位置元素或者最后一个兄弟之后新增一个元素。
InsertElem 在当前位置元素或者第一个兄弟之前插入一个元素。
AddChildElem 在当前子位置元素或者最后一个子位置之后增加一个元素。
InsertChildElem 在当前子位置元素或者第一个子位置之前插入一个元素。
InsertNode 在当前节点的前面或者父元素内容的开头新增一个节点。
译注:注意区分元素和节点,元素只是一种特殊的节点而已。
5)删除元素
RemoveElem 删除当前位置元素,包括子元素。
RemoveChildElem 删除当前位置的子元素,包括子元素的子元素。
RemoveNode 删除当前节点。
6)获取数据
GetData 返回当前位置元素或者节点的字符串值。
GetChildData 返回当前子位置元素的字符串值。
GetElemContent 返回当前位置包括子位置的markup字符串内容
GetSubDoc 返回当前位置包括子位置的子文档markup字符串内容
7)设置值,修改数据
SetData 设置当前位置元素或者节点的值
SetChildData 设置当前子位置元素的值
SetElemContent 将当前位置元素用markup(标记)内容来替换
SetAttrib 设置当前位置元素的指定属性的值
SetChildAttrib 设置当前子位置元素的指定属性的值
GetTagName 获得当前位置的标签的名
8)部分函数不解
例1、FindChildElem(“ITEM”)
<ORDER>
<ITEM>
<SN>132487A-J </SN>
<NAME>crank casing </NAME>
<QTY>1 </QTY>
</ITEM>
</ORDER>
xml.FindChildElem("ITEM")
xml.FindChildElem("SN");
CString csSN = xml.GetChildData();
如上并不能获得SN的值,必须增加xml.IntoElem();xml.FindChildElem("SN");所以FindChildElem并没有进入到<SN>依然处于<ITEM>的位置。该函数并不改变当前位置,可以使用GetTagName来获取当前的位置。该函数如果返回空就表示不存在该元素。
9)常用函数
1.CString转char *
windows strslave = xml.GetChildData(); cout << "sssss "<<strslave<<endl; char *p = (LPSTR)(LPCTSTR)strslave;
linux 下转换函数CString. c_str();