XML总结

2021-07-20  本文已影响0人  _张鹏鹏_

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();
    }
}

构造:

参考文献:

  1. TinyXml库 使用方法
  2. XML 系列教程
  3. 菜鸟网XML教程
上一篇下一篇

猜你喜欢

热点阅读