最近在开发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-ctrlDisable_NAND_boot="false"Disable_EMMC_boot="false" /><secure-ctrlEnable_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-lockcom_ctrl_lock="false"usb_id_lock="false" /><secure-locksec_msc_lock="false"sec_attr_lock="true" /><usb-id vid="0000" pid="0000"/> </efuse></commands>
</flashtool-config>
- XML只能这么多了,再多要吃国家饭了。
作品原创,转载请注明出处,蟹蟹!