最近在开发MTK工具过程中,发现了一个C++解析XML文件的非常好用的方法,下面对此做个记录:
- 引用两个头文件:
#include "tinyxml.h"
#include "tinystr.h"
- 这两个头文件不是C++标准库,需要自行下载下来放到代码中去引用,这里贴上链接:
tinyxml.h下载地址
同时需要将相应的cpp放到代码下。 - 接下来就是常规操作了,对象实例化等等,直接贴上代码,稍微用点心,还是很简单的:
#define FILENAME "test.xml" //指定文件名
int __fastcall TBOOT1::ReadEfuseByXML()
{
TiXmlDocument *m_pXmlDoc;
//Efuse_Secure_Setting和Efuse_Lock_Setting是我自定义的两个结构体,具体代码就不贴了
memset(&secure_set, 0, sizeof(Efuse_Secure_Setting));
memset(&lock_set, 0, sizeof(Efuse_Lock_Setting));
m_pXmlDoc = new TiXmlDocument(FILENAME);
bool m_isloadfile = m_pXmlDoc->LoadFile(TIXML_ENCODING_UTF8); //LoadFile是tinyxml的自带函数,load xml文件
if (TRUE != m_isloadfile)
{
return -1;
}
int ret;
bool pbool;
//实例化句柄
TiXmlHandle docHandle(m_pXmlDoc);
//TiXmlElement* childCommonCtrl = docHandle.FirstChild("flashtool-config").FirstChild("commands").FirstChild("efuse").FirstChild("common-ctrl").ToElement();//读子节点
//if (NULL == childCommonCtrl) {return S_BROM_EFUSE_BLOW_ERROR;}
TiXmlElement* childSecureCtrl = docHandle.FirstChild("flashtool-config").FirstChild("commands").FirstChild("efuse").FirstChild("secure-ctrl").ToElement();//读子节点
if (NULL == childSecureCtrl) {return S_BROM_EFUSE_BLOW_ERROR;}
//TiXmlElement* childSbcKeyCtrl = docHandle.FirstChild("flashtool-config").FirstChild("commands").FirstChild("efuse").FirstChild("sbc-pub-key").ToElement();
//if (NULL == childSbcKeyCtrl) {return S_BROM_EFUSE_BLOW_ERROR;}
//读Secure节点的属性
ret = childSecureCtrl->QueryBoolAttribute("Enable_ACC", &pbool);//读节点属性,也就是Enable_ACC具体的值
if (ret == TIXML_NO_ATTRIBUTE) {
secure_set.acc_en = BoolToEfuseOpt(false);
}
else if (ret == TIXML_SUCCESS) {
secure_set.acc_en = BoolToEfuseOpt(pbool);
if (secure_set.acc_en != MainForm->m_clsEfuseXmlSetting.secure_arg.acc_en) //xml与写入手机的efuse属性值比较
{
Application->MessageBox("Efuse Error", "Efuse��֤ʧ��\n����Enable_ACC", MB_OK);
return S_BROM_EFUSE_BLOW_ERROR;
}
}
else {return S_GET_XML_SECURE_CTRL_FAIL;}
return S_EFUSE_SUCCESS;
}
- xml的内容我截取了一部分,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<flashtool-config>
<commands>
<efuse>
<common-ctrl
Disable_NAND_boot="false"
Disable_EMMC_boot="false" />
<secure-ctrl
Enable_DAA="true"
Enable_SBC="true"
Disable_JTAG="true" />
<sbc-pub-key>
<key-type>abb</key-type>
<pub-key-e>11111</pub-key-e>
<pub-key-n>12345</pub-key-n>
</sbc-pub-key>
<common-lock
com_ctrl_lock="false"
usb_id_lock="false" />
<secure-lock
sec_msc_lock="false"
sec_attr_lock="true" />
<usb-id vid="0000" pid="0000"/>
</efuse>
</commands>
</flashtool-config>
- XML只能这么多了,再多要吃国家饭了。
作品原创,转载请注明出处,蟹蟹!