XML总结

作者: _张鹏鹏_ | 来源:发表于2021-07-20 14:15 被阅读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教程

    相关文章

      网友评论

          本文标题:XML总结

          本文链接:https://www.haomeiwen.com/subject/daalmltx.html