嵌入式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();