XML简介:
XML 指可扩展标记语言(EXtensible Markup Language),也是一种序列化方式。
语法:
声明:
声明是可选部分,如果存在,需要放在文档的第一行,如下所示:
<?xml version="1.0" encoding="utf-8"?>
注释:
<!-- 单行注释 -->
<!--
多行注释
-->
<![CDATA[[
这是多行注释
]]>
标签:
所有的 XML 元素都必须有一个关闭标签,如下:
<message> this is an example</message>
<Signal comment="这个标签正确"/>
<Signal comment="这个标签不正确">
元素:
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
一个元素可以包含:
- 其他元素
- 文本
- 属性
- 或混合以上所有...
<bookstore>
<book category="CHILDREN">
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
属性:
属性(Attribute)提供有关元素的额外信息。
属性通常提供不属于数据组成部分的信息。在下面的实例中,文件类型与数据无关,但是对需要处理这个元素的软件来说却很重要:
<file type="gif">computer.gif</file>
属性值必须被引号包围,不过单引号和双引号均可使用。比如一个人的性别,person 元素可以这样写:
<person sex="female">
或者这样也可以:
<person sex='female'>
元素 vs 属性:
请看这些实例:
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
在第一个实例中,sex 是一个属性。在第二个实例中,sex 是一个元素。这两个实例都提供相同的信息。
没有什么规矩可以告诉我们什么时候该使用属性,而什么时候该使用元素。
我的经验是在 HTML 中,属性用起来很便利,但是在 XML 中,您应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用元素吧。
XML解析库:
介绍:
这里我们使用TinyXml库对XML进行解析。
示例:
解析:
在实际项目中,在对接异厂商设备时,对方通常会提供SDK,有些厂商的SDK会涉及到XML数据的解析,比如:
/************************************************************************/
/* xml:摄像机列表信息,调用者申请,空间不够时候返回ERR_BUFF_LEN错误码 */
/* (XML格式) */
/* <Message>
<Organ id="机构ID" name="机构名称">
<SubOrgan>
<Organ id="" name="">
<SubOrgan>
<!-- more -->
</SubOrgan>
</Organ>
<!-- 更多的子机构 -->
</SubOrgan>
<SignalList>
<Signal id="ipc_id" name="ipc_name" ptz="0" longitude="" latitude="" online="0" rtsp="取流地址"/>
<!-- 更多的信号源 -->
</SignalList>
</Organ>
<!-- 更多机构 -->
</Message>
*/
/* len:缓冲区长度 */
/* 返回值:0-成功,失败返回-1 */
/************************************************************************/
PLATFORM_API int STDCALL Platform_QuerySignalList(char* xml,unsigned len);
函数Platform_QuerySignalList
会返回一个xml格式的数据,通过解析xml,我们可以获得我们需要的参数,示例代码如下:
void ParseSignalList(const string& xml)
{
tinyxml2::XMLTDocument doc;
doc.Parse(xml.c_str(), xml.size());
tinyxml2::XMLElement* pRoot = doc.RootElement();
tinyxml2::XMLPrinter printer;
doc.Print(&printer);
TraceInfo("%s %s", CLASS_FUNC, printer.CStr());
if (pRoot == NULL || strcmp(pRoot->Value(), "Message"))
{
TraceError("No expected Message!");
return;
}
tinyxml2::XMLElement* pOrgan = pRoot->FirstChildElement("Organ");
if (pOrgan == NULL)
{
TraceError("No expected Organ!");
return;
}
tinyxml2::XMLElement* pSignalList = pOrgan->FirstChildElement("SignalList");
if (pSignalList == NULL)
{
TraceError("No expected SignalList!");
return;
}
tinyxml2::XMLElement* pSignal = pSignalList->FirstChildElement("Signal");
if (pSignal == NULL)
{
TraceError("No expected Signal!");
return;
}
while (pSignal)
{
const char* pId = pSignal->Attribute("id");
const char* pName = pSignal->Attribute("name");
const char* pVport = pSignal->Attribute("vport");
const char* pOnlile = pSignal->Attribute("online");
const char* pRtsp = pSignal->Attribute("rtsp");
if (pId == NULL || pName == NULL || pVport == NULL || pOnlile == NULL || pRtsp == NULL)
{
TraceError("Signal Attribute error!!!");
continue;
}
CAthenaSignal athenaSignal(pId, pName, pVport, pOnlile, pRtsp);
m_athenaSignals.Add(athenaSignal);
pSignal = pSignal->NextSiblingElement();
}
}
网友评论