tinyxml2的使用

9 篇文章 0 订阅
  • 安装
    tinyxml2下载链接

  • 说明
    关键类

    • XMLDocument:XML文档
    • XMLElement:XML标签对(标签对之中还能嵌套许多elements,最大的一个Element就是xml文档的根节点,必须唯一)
    • XMLDeclaration:每个XML文档开头必备的<? xxxxxx ?>
    • XMLComment:作为注释出现在任何地方,它被<!-- 与 -->包围

示例一:

  • XML文件如下
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
    <ID1 ID1-1="123" ID1-2="234" ID1-3="345">456</ID1>
    <ID2>456</ID2>
</CONFIG>
  • 读写XML文件
#include <iostream>
#include "tinyxml2.h"

void WriteXMLFile()
{
    tinyxml2::XMLDocument doc;
    //const char* declaration ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
    //doc.Parse(declaration);//会覆盖xml所有内容

    //声明(效果同上)
    tinyxml2::XMLDeclaration* declaration=doc.NewDeclaration();
    doc.InsertFirstChild(declaration);

    tinyxml2::XMLElement* root=doc.NewElement("CONFIG");

    tinyxml2::XMLElement* ID1 = doc.NewElement("ID1");
    ID1->SetAttribute("ID1-1",123);
    ID1->SetAttribute("ID1-2",234);
    ID1->SetAttribute("ID1-3",345);
    ID1->SetText(456);
    root->InsertEndChild(ID1);

    tinyxml2::XMLElement* ID2 = doc.NewElement("ID2");
    ID2->SetText(456);
    root->InsertEndChild(ID2);

    doc.InsertEndChild(root);

    doc.SaveFile("XMLFILE.xml");
}

void ReadXMLFile()
{
    tinyxml2::XMLDocument docXml;
    tinyxml2::XMLError errXml = docXml.LoadFile("XMLFILE.xml");

    if(tinyxml2::XML_SUCCESS == errXml)
    {
        tinyxml2::XMLElement* elmtRoot = docXml.RootElement();

        tinyxml2::XMLElement* ID1 = elmtRoot->FirstChildElement("ID1");
        tinyxml2::XMLElement* ID2 = elmtRoot->FirstChildElement("ID2");

        const tinyxml2::XMLAttribute *ID1_1 = ID1->FirstAttribute();
        std::cout<< ID1_1->Name() << ":" << ID1_1->Value() << std::endl;

        const tinyxml2::XMLAttribute *ID1_2 = ID1->FirstAttribute()->Next();
        std::cout<< ID1_2->Name() << ":" << ID1_2->Value() << std::endl;

        const tinyxml2::XMLAttribute *ID1_3 = ID1->FirstAttribute()->Next()->Next();
        std::cout<< ID1_3->Name() << ":" << ID1_3->Value() << std::endl;

        const char* pContent1 = ID1->GetText();
        std::cout << "ID1: " << pContent1 << std::endl;

        const char* pContent2 = ID2->GetText();
        std::cout << "ID2: " << pContent2 << std::endl;
    }
}

int main(int argc, char *argv[])
{
    WriteXMLFile();
    ReadXMLFile();
}

示例二:

<CameraPlatMovePara DetaHeight="0.05" DetaYaw="0.097" Speed="0.05"/>
//read xml file
XMLDocument CameraPlatMovePara;
CameraPlatMovePara.LoadFile("CameraPlatMovePara.xml");
if(CameraPlatMovePara.ErrorID() == XMLError::XML_SUCCESS)
{
    XMLElement *PlatInfo = CameraPlatMovePara.FirstChildElement("CameraPlatMovePara");
    m_nCameraPlatDetaHeight = atof(PlatInfo->Attribute("DetaHeight"));
    m_nCameraPlatDetaYaw = atof(PlatInfo->Attribute("DetaYaw"));
    m_nCameraPlatSpeed = atof(PlatInfo->Attribute("Speed"));
}

示例三:

<?xml version="1.0" encoding="UTF-8"?>
<RFID_CONFIG>
    <parameter Name="nRSS" Value="2"/>
    <parameter Name="nFilterTime" Value="5"/>
</RFID_CONFIG>
#include <iostream>
#include "tinyxml2.h"
#include "stdio.h"


int main(int argc,char* argv[])
{
    tinyxml2::XMLDocument docXml;
    tinyxml2::XMLError errXml = docXml.LoadFile("config.xml");

    if(tinyxml2::XML_SUCCESS != errXml)
    {
        std::cout << "read config.xml error" << std::endl;
        return -1;
    }

    tinyxml2::XMLElement* piXmlElemRoot = docXml.RootElement();
    tinyxml2::XMLElement* piXmlElemParam=piXmlElemRoot->FirstChildElement("parameter");

    uint16_t nSetFilterTime = 0;
    uint8_t  nSetRSS = 0;

    if(NULL == piXmlElemParam)
    {
        std::cout << "read config.xml error" << std::endl;
        return -1;
    }
    do
    {
        std::cout << piXmlElemParam->Value() << std::endl;

        const tinyxml2::XMLAttribute* piParam = piXmlElemParam->FirstAttribute();
        std::cout << piParam->Value() << std::endl;

        if(0 == strcmp(piParam->Value(),"nRSS"))
        {
            nSetRSS = (uint8_t)(atoi(piParam->Next()->Value()));
            printf("%d\n",nSetRSS);
        }

        if(0 == strcmp(piParam->Value(),"nFilterTime"))
        {
            nSetFilterTime = (uint16_t)(atoi(piParam->Next()->Value()));
            printf("%d\n",nSetFilterTime);
        }
        piXmlElemParam = piXmlElemParam->NextSiblingElement("parameter");

    }while(NULL!=piXmlElemParam);

    return 0;
}

注意:qt配置.pro:LIBS += -L/../tinyxml2 -ltinyxml2

  • 使用Qt库读取xml
void readXmlFile()
{
    QFile file("config.xml");
    QString error = "";
    QDomDocument doc;

    int row = 0, column = 0;
    if (!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "open config.xml err";
        return;
    }
    if(!doc.setContent(&file,false,&error,&row,&column))
    {
        qDebug() << "config.xml set content failed";
        file.close();
        return;
    }
    file.close();

    QDomElement root = doc.documentElement();
    QDomNode node = root.firstChildElement("Parameters");
    do
    {
        QDomElement element = node.toElement();
        if(!element.isNull())
        {
            if(element.attributeNode("Name").value().toStdString() == "PressureNum")
            {
                qDebug() << element.attributeNode("Value").value();
            }
            if(element.attributeNode("Name").value().toStdString() == "Number")
            {
                qDebug() << element.attributeNode("Value").value();
            }
        }
        node = node.nextSiblingElement("Parameters");
    }while(!node.isNull());
}

注意:qt配置.pro:
QT += xml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值