最近在做毕业论文,可能要使用TinyXML。全是英文看着费劲。所以翻译了一下! 所有翻译后的文件直接被放到网盘中了。如果您需要的话自己去找吧 !网盘地址见我的主页。

网盘中有一个名字叫做《TinyXML文档集合》的word文件。

(1)http://www.grinninglizard.com/tinyxmldocs/index.html    翻译了这个页面上的所有东西

(2)http://www.grinninglizard.com/tinyxmldocs/tutorial0.html翻译了这个页面上的所有东西

TinyXML  基本操作如下,经过VS2013调试,全部能够运行!

#include "iostream"
#include "vector"
#include "string"
#include "list"
#include "deque"
#include "utility"
#include "map"
#include "set"
#include "fstream"
#include "sstream"
#include "algorithm"
#include "numeric"
#include "iterator"
#include "functional"
#include "typeinfo.h"
#include "memory"
#include "exception"
#include "assert.h"
#include <bitset>
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include <string.h>using namespace  std;#include <stdio.h>
#include <stdlib.h>
#include "tinyxml.h"
#include "tchar.h"
using namespace std;// <?xml version="1.0" ?>
// <MyApp>
//     <Messages>
//         <Welcome>Welcome to MyApp</Welcome>
//         <Farewell>Thank you for using MyApp</Farewell>
//     </Messages>
//     <Windows>
//         <Window name="MainFrame" x="5" y="15" w="400" h="250" />
//     </Windows>
//     <Connection ip="192.168.0.1" timeout="123.456000" />
// </MyApp>
//创建了一个D:\\yang.xml的文件//通过指定名字创建一个XML文件。参数是文件的名字。
bool CreateXMLFile(char * FileName)
{TiXmlDocument * pDoc = new TiXmlDocument;//创建一个文档类型对象,整个XML文档的最上层节点if (NULL==pDoc){return false;}
//构造函数
//  TiXmlDeclaration(const char* _version,
//      const char* _encoding,
//      const char* _standalone);  standalone脱机,单独,独立//创造一个声明的类。<?xml version="1.0" ?>TiXmlDeclaration * pDeclaration = new TiXmlDeclaration(("1.0"), (""), (""));if (NULL==pDeclaration){return false;}pDoc->LinkEndChild(pDeclaration);//把pDeclaration做为pDoc的一个孩子节点。//生成一个根节点:MyAppTiXmlElement * pRootEle = new TiXmlElement(("MyApp"));if (NULL==pRootEle){return false;}pDoc->LinkEndChild(pRootEle);//生成子节点:MessagesTiXmlElement * pMsg = new TiXmlElement(("Messages"));if (NULL==pMsg){return false;}pRootEle->LinkEndChild(pMsg);//生成子节点welcomeTiXmlElement * pWelcome = new TiXmlElement(("Welcome"));if (NULL==pWelcome){return false;}pMsg->LinkEndChild(pWelcome);//设置Welcome节点的值const char * strValue = ("Welcome to MyApp");TiXmlText * pWelcomeValue = new TiXmlText(strValue);pWelcome->LinkEndChild(pWelcomeValue);//生成子节点:FarewellTiXmlElement * pFarewell = new TiXmlElement(("Farewell"));if (NULL==pFarewell){return false;}pMsg->LinkEndChild(pFarewell);//设置Farewell节点的值strValue = ("Thank you for using MyApp");TiXmlText * pFarewellValue = new TiXmlText(strValue);pFarewell->LinkEndChild(pFarewellValue);//生成子节点:WindowsTiXmlElement * pWindows = new TiXmlElement(("Windows"));if (NULL==pWindows){return false;}pRootEle->LinkEndChild(pWindows);//生成子节点:WindowTiXmlElement * pWindow = new TiXmlElement(("Window"));if (NULL==pWindow){return false;}pWindows->LinkEndChild(pWindow);//设置节点Window的值pWindow->SetAttribute(("name"), ("MainFrame"));pWindow->SetAttribute(("x"), ("5"));pWindow->SetAttribute(("y"), ("15"));pWindow->SetAttribute(("w"), ("400"));pWindow->SetAttribute(("h"), ("250"));//生成子节点connectionTiXmlElement * pConnect = new TiXmlElement(("Connection"));if (NULL==pConnect){return false;}pRootEle->LinkEndChild(pConnect);//设置节点connection的值pConnect->SetAttribute(("ip"), ("192.168.0.1"));pConnect->SetAttribute(("timeout"), ("123.456000"));pDoc->SaveFile(FileName);
}//打印整个XML文件中的所有行
bool  PintXML(const char * FileName)
{TiXmlDocument * pDocument = new TiXmlDocument;if (NULL==pDocument){return false;}pDocument->LoadFile(FileName);pDocument->Print();
}//获取指向指定名字节点的指针
//三个参数的意思:第一个参数表示一个XML文档中树根节点,strNodeName表示你要查找的节点的名字,第三个参数返回指向找到节点的指针
bool GetNodePointerByName(TiXmlElement * pRootEle, string & strNodeName, TiXmlElement * & Node)
{//假如等于根节点名字,就退出if (strNodeName==pRootEle->Value()){Node = pRootEle;return true;}TiXmlElement * pEle = pRootEle;for (pEle = pRootEle->FirstChildElement(); pEle;pEle=pEle->NextSiblingElement()){//递归处理子节点,获取节点指针if (GetNodePointerByName(pEle,strNodeName,Node)){return true;}}return false;
}//通过名字查询一个节点中的文本内容。
//第一个参数是XML文件名字,第二个参数是节点的名字,第三个参数是返回的节点的内容
bool QueryNode_Text(string XmlFile, string strNodeName, string & strText)
{//定义一个TiXmlDocument  * pDoc = new TiXmlDocument;if (NULL==pDoc){return false;}pDoc->LoadFile(XmlFile.c_str());TiXmlElement * pRootEle = pDoc->RootElement();if (NULL==pRootEle){return false;}TiXmlElement * pNode = NULL;GetNodePointerByName(pRootEle, strNodeName, pNode);if (NULL!=pNode){if (NULL!=pNode->GetText()){strText=pNode->GetText();return true;}else{cout << "这个节点没有text内容" << endl;return false;}//strText=pNode->GetText();//注意上面的这条语句,如果这个节点中是没有任何text内容的话,那么就会产生运行时候错误。//所以如果不想产生运行时错误,那么就要进行一个判断是否为空串。}else{return false;}
}//查询节点属性输入文件名字,节点名字,和一个map。其中最后一个参数map用来保存,若干属性的值。
bool  QueryNode_Attribute(string XmlFile, string strNodeName, map<string, string>  & AttMap)
{typedef pair<string, string>  String_Pair;TiXmlDocument * pDoc = new TiXmlDocument;//定义一个文档类型if (NULL==pDoc){return false;}pDoc->LoadFile(XmlFile.c_str());TiXmlElement * pRootEle = pDoc->RootElement();//获取文档的根if (NULL==pRootEle){return false;}TiXmlElement * pNode = NULL;GetNodePointerByName(pRootEle, strNodeName, pNode);if (NULL!=pNode){TiXmlAttribute * pAttr = NULL;//创建一个属性类for (pAttr = pNode->FirstAttribute(); pAttr;pAttr=pAttr->Next())//获取【每一个】属性{string strAttName = pAttr->Name();//获取属性的-----键string strAttValue = pAttr->Value();//获取属性的-----值AttMap.insert(String_Pair(strAttName, strAttValue));//把属性的(键---值)对做成String_Pair,然后把String_Pair对插入到Map中,并通过第三个参数的引用返回。}}else{return false;}return true;
}//通过节点的名字,在XML文档中,删除指定的节点。注意删除一个节点,不仅仅删除了这个节点,而且会删除它的子孙。
bool DelNode(string XmlFile, string strNodeName)
{TiXmlDocument * pDoc = new TiXmlDocument;if (NULL == pDoc){return false;}pDoc->LoadFile(XmlFile.c_str());TiXmlElement * pRootEle = pDoc->RootElement();if (NULL == pRootEle){return false;}TiXmlElement * pNode = NULL;GetNodePointerByName(pRootEle, strNodeName, pNode);if (pRootEle == pNode){if (pDoc->RemoveChild(pRootEle))//如果查询的节点是根节点,那么就删除这个节点{pDoc->SaveFile(XmlFile.c_str());//删除这个节点之后保存这个新的XML文件return true;}else{return false;}}//endifif (NULL != pNode){TiXmlNode * pParNode = pNode->Parent();//找到要删除节点的父节点if (NULL == pParNode){return false;}TiXmlElement * pParentEle = pParNode->ToElement();//把一个Node类型节点转换成为一个Element类型节点//也就是把一个TiXmlNode类型的节点通过ToElement()调用转换成为TiXmlElement类型节点。if (NULL != pParentEle){if (pParentEle->RemoveChild(pNode))//调用父节点pParentEle的一个函数RemoveChild,然后删除自己的一个孩子节点pNode{pDoc->SaveFile(XmlFile.c_str());return true;}else{return false;}}}//endifelse{return false;}
}//修改节点Text内容的操作
//第一个参数是文件名字,第二个参数是要修改的节点的名字,第三个是修改的新文本
bool ModifyNode_Text(string XmlFile, string strNodeName, string strText)
{TiXmlDocument * pDoc = new TiXmlDocument;if (NULL==pDoc){return false;}pDoc->LoadFile(XmlFile.c_str());TiXmlElement * pRootEle = pDoc->RootElement();if (NULL==pRootEle){return false;}TiXmlElement * pNode = NULL;GetNodePointerByName(pRootEle, strNodeName, pNode);if (NULL!=pNode){pNode->Clear();//首先清除pNode指针所指向的节点原来的所有文本。//然后插入文本保存文件TiXmlText * pValue = new TiXmlText(strText.c_str());pNode->LinkEndChild(pValue);//创建一个TiXmlText类型的节点,让这个节点作为pNode节点的最后一个孩子。pDoc->SaveFile(XmlFile.c_str());//修改之后保存整个XML文件。return true;}else{return false;}
}//通过指定的节点的名字,修改节点的属性值
//第一个参数XML文件的名字,第二个参数节点的名字,第三个参数要修改的属性的值
bool ModifyNode_Attribute(string XmlFile,string strNodeName,map<string,string> & AttMap)
{typedef pair<string, string> String_Pair;TiXmlDocument * pDoc = new TiXmlDocument;if (NULL==pDoc){return false;}pDoc->LoadFile(XmlFile.c_str());TiXmlElement * pRootEle = pDoc->RootElement();if (NULL==pRootEle){return false;}TiXmlElement * pNode = NULL;GetNodePointerByName(pRootEle, strNodeName, pNode);if (NULL!=pNode){TiXmlAttribute * pAttr = NULL;string strAttName = ("");//原来这里的代码上是这样的    _T("");但是这样的话编译的时候就会出现错误。string strAttValue = ("");for (pAttr = pNode->FirstAttribute(); pAttr;pAttr=pAttr->Next()){strAttName = pAttr->Name();map<string, string>::iterator iter;for (iter = AttMap.begin(); iter != AttMap.end();iter++){//遍历整个的属性map,如果找到和输入的属性名字相同的属性,那么就把指定的属性值设置成为输入属性的值。if (strAttName==iter->first){pAttr->SetValue((iter->second).c_str());}}}pDoc->SaveFile(XmlFile.c_str());return true;}else{return false;}
}//在指定的节点下面增加一个孩子节点,并且这个新节点可以设置text内容
//第一个参数是XML文档的文件名字,第二个参数是要插入的父节点的名字,第三个参数是新创建的节点的名字,第四个参数是新创建的节点的文本内容
bool AddNode_Text(string XmlFile, string strParNodeName, string strNodeName, string strText)
{TiXmlDocument * pDoc = new TiXmlDocument;if (NULL==pDoc){return false;}pDoc->LoadFile(XmlFile.c_str());TiXmlElement * pRootEle = pDoc->RootElement();if (NULL==pRootEle){return false;}TiXmlElement * pNode = NULL;GetNodePointerByName(pRootEle, strParNodeName, pNode);//首先找到父节点,因为将在这个节点下面插入新创建的子节点if (NULL!=pNode){//生成子节点TiXmlElement * pNewNode = new TiXmlElement(strNodeName.c_str());if (NULL==pNewNode){return false;}//设置节点文本,然后插入节点TiXmlText * pNewValue = new TiXmlText(strText.c_str());pNewNode->LinkEndChild(pNewValue);//TiXmlNode* LinkEndChild( TiXmlNode* addThis )pNode->InsertEndChild(*pNewNode);//TiXmlNode* InsertEndChild( const TiXmlNode& addThis ),这个函数的实现调用了InsertEndChild()pDoc->SaveFile(XmlFile.c_str());return true;}else{return false;}}//在指定名字节点下面增加一个节点,并且设置这个节点的属性值
//第一个参数是要操作的XML文件的名字,第二个参数是父节点的名字,第三个参数是新插入的节点的名字,第四个参数是要设置的属性值
bool AddNode_Attribute(string XmlFile, string strParNodeName, string strNodeName, map<string, string>&AttMap)
{TiXmlDocument * pDoc = new TiXmlDocument;if (NULL == pDoc){return false;}pDoc->LoadFile(XmlFile.c_str());TiXmlElement * pRootEle = pDoc->RootElement();if (NULL==pRootEle){return false;}TiXmlElement * pNode = NULL;GetNodePointerByName(pRootEle, strParNodeName, pNode);if (NULL!=pNode){TiXmlElement * pNewNode = new TiXmlElement(strNodeName.c_str());if (NULL==pNewNode){return false;}map<string, string>::iterator iter;for (iter = AttMap.begin(); iter != AttMap.end();iter++){pNewNode->SetAttribute(iter->first.c_str(), iter->second.c_str());}pNode->InsertEndChild(*pNewNode);pDoc->SaveFile(XmlFile.c_str());return true;}else{return false;}
}//打印出整个的XML文档
bool PintXML(string FileName)
{TiXmlDocument *pDoc = new TiXmlDocument();if (NULL == pDoc){return false;}pDoc->LoadFile(FileName.c_str());pDoc->Print();getchar();
}int main(int argc, char * argv[])
{   char * filename = "D:\\yang.xml";{//块1//创建一个yang.xml文件bool result = CreateXMLFile(filename);if (!result){cout << "出现了错误!" << endl;}else{cout << "XML文件创建成功" << endl << endl;}//打印整个的yang.xml文件{PintXML(filename);}}//块1结束{//块2//在这个yang.xml文件中查找welcome节点,并获取一个指向这个节点的指针,然后输出这个节点的类型。TiXmlDocument * pDocument = new TiXmlDocument;if (NULL == pDocument){return false;}pDocument->LoadFile(filename);TiXmlElement * pRoot = pDocument->RootElement();string  strNodeName("Window");TiXmlElement * pToNode = NULL;GetNodePointerByName(pRoot, strNodeName, pToNode);if (pToNode){cout << "\n========================" << endl;cout << pToNode->Type() << endl;//这里会打印类型1,因为这是一个TiXmlElement类型的对象。cout << "========================" << endl;}//      enum NodeType//         {//             TINYXML_DOCUMENT,    0//            TINYXML_ELEMENT,     1//            TINYXML_COMMENT,     2//            TINYXML_UNKNOWN,     3//            TINYXML_TEXT,        4//            TINYXML_DECLARATION, 5 //           TINYXML_TYPECOUNT    6//        };}//块2结束{//块3//查找指定名字的节点的内容,然后输出{//查询一个节点中的文本内容,[此处查找的Windows节点是没有text内容的,查找不成功]string  strOutput;string FileName(filename);string  strNodeName("Window");bool result = QueryNode_Text(FileName, strNodeName, strOutput);if (result){cout << "\n========================" << endl;cout << strOutput << endl;cout << "========================" << endl;}}{//查询一个节点中的文本内容,[此处查找的Welcome节点是有text内容的,查找成功]string  strOutput;string FileName(filename);string  strNodeName("Welcome");bool result = QueryNode_Text(FileName, strNodeName, strOutput);if (result){cout << "\n========================" << endl;cout << strOutput << endl;cout << "========================" << endl;}}}//块3结束{//块4开始//通过节点名字查找节点的所有属性。map<string, string>   AttMap_inPut;map<string, string>::iterator  iter;string FileName(filename);string  strNodeName("Window");bool result = QueryNode_Attribute(FileName, strNodeName, AttMap_inPut);if (result){for (iter = AttMap_inPut.begin(); iter != AttMap_inPut.end(); ++iter){cout << iter->first << "\t" << iter->second << endl;}cout << "========================" << endl;}else{cout << "读取属性出现错误" << endl;}}//块4结束{//块5开始//通过节点的名字,在XML文档中,删除指定的节点。getchar();string FileName(filename);string  strNodeName("Welcome");bool result = DelNode(FileName, strNodeName);if (false == result){cout << "删除节点错误!\n" << endl;}else{cout << "删除节点成功!\n" << endl;}}//块5结束{//块6开始//修改指定名字节点的text值。getchar();string FileName(filename);string  strNodeName("Farewell");string strText("This is the lastest text");bool result = ModifyNode_Text(FileName, strNodeName, strText);if (!result){cout << "\n修改节点文本信息错误!" << endl;}else{cout << "\n修改名字为:" << strNodeName << "节点信息为" << strText << endl;cout << "修改成功!\n" << endl;}}//块6结束{//块7开始//修改指定名字节点的属性的值map<string, string>  AttMap_input;//name="MainFrame" x="5" y="15" w="400" h="250"AttMap_input.insert(pair<string, string>("name", "_MainFrame"));AttMap_input.insert(pair<string, string>("x", "_5"));AttMap_input.insert(pair<string, string>("y", "_15"));AttMap_input.insert(pair<string, string>("w", "_400"));AttMap_input.insert(pair<string, string>("h", "_250"));string FileName(filename);string  strNodeName("Window");bool result = ModifyNode_Attribute(FileName, strNodeName, AttMap_input);cout << result << endl;if (!result){cout << "改变属性值操作失败!" << endl;}else{cout << "改变属性值操作成功!" << endl;}}//块7结束{//块8开始//在指定名字的节点下面创建一个新的节点。并且设置新的节点的text内容。string FileName(filename);string  strParNodeName("Windows");string  strNodeName("Window_new");string  strText("This is a new Create Node!");bool result = AddNode_Text(FileName, strParNodeName, strNodeName, strText);if (result){cout << "创建指定名字:" << strNodeName << "的新节点成功!" << endl;}else{cout << "创建节点失败" << endl;}}//块8结束{//块9开始//插入新的节点并设置节点的属性值。map<string, string>  AttMap_input;//name="MainFrame" x="5" y="15" w="400" h="250"AttMap_input.insert(pair<string, string>("_name", "_MainFrame"));AttMap_input.insert(pair<string, string>("_x", "_5"));AttMap_input.insert(pair<string, string>("_y", "_15"));AttMap_input.insert(pair<string, string>("_w", "_400"));AttMap_input.insert(pair<string, string>("_h", "_250"));string FileName(filename);string strParNodeName("MyApp");string  strNodeName("NewAtt");bool result = AddNode_Attribute(FileName, strParNodeName, strNodeName, AttMap_input);if (result){cout << "增加新的节点,并设置属性值成功" << endl;}else{cout << "增加新的节点,并设置属性值失败" << endl;}}//块9结束{//块10,打印出整个的XML文档string FileName(filename);PintXML(FileName);}getchar();return 0;
}

TinyXml Documentation 翻译 TinyXML Tutorial翻译相关推荐

  1. python有道自动翻译_Python 调用有道翻译接口实现翻译

    最近为了熟悉一下 js 用有道翻译练了一下手,写一篇博客记录一下,也希望能对大家有所启迪,不过这些网站更新太快,可能大家尝试的时候会有所不同. 首先来看一下网页 post 过去的数据 大家不难发现,我 ...

  2. 谷歌生物医学专用翻译_文献翻译|知云翻译,写论文必备~

    大家好,我是小秀,今天在这里给大家请个假,今天更完了之后,请假几天.由于最近学业繁忙,学期过了一半,小秀得忙论文,作业之类的,所以后面鸽几天. 下面呢,来说说今天的论文文献翻译的软件吧!因为写论文不得 ...

  3. python有道翻译接口-Python通过调用有道翻译api实现翻译功能示例

    本文实例讲述了Python通过调用有道翻译api实现翻译功能.分享给大家供大家参考,具体如下: 通过调用有道翻译的api,实现中译英.其他语言译中文 Python代码: # coding=utf-8 ...

  4. 掘金翻译计划,翻译掘金上优质的英文文章

    原文链接:https://github.com/xitu/gold-miner 掘金翻译计划 掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章.内容覆盖 Andro ...

  5. signature=3ba70fa0be2ca50c615373e5495718b1,翻译文化观与翻译改写

    odern chinese M158 XIANDAI YUWEN 2009.10 读书与评论 活给人带来的紧张气氛,他们感到压抑烦躁,而在充满力量. 自由与快乐的顽童那里,成人的焦虑与烦恼也并得以释放 ...

  6. Python 调用有道翻译api接口翻译外文网站的整篇西班牙文实战演示

    Python 调用有道翻译 api 接口翻译整篇西班牙文实战演示 第一章:翻译效果展示 ① 翻译文章示例一[阿尔卡拉门的无海摩纳哥:"不到4万欧元,你就不能在这里租任何东西."] ...

  7. 在线识图翻译_拍照翻译ios版下载在线识图翻译-免费拍照翻译软件苹果版下载...

    拍照翻译app在我们的学习中扮演着很重要的角色,当我们遇到看不懂的英文时就可以通过它来帮我们翻译,还不用一个字一个字输入,只要拍照即可快速翻译.这款软件涵盖了各国语言资源,用户可以使用这款软件进行各国 ...

  8. java泛型程序设计——翻译泛型表达式+翻译泛型方法

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 翻译泛型表达式+翻译泛型方法 的知识: [1]翻译泛型表达式 1.1 ...

  9. Python 大规模异步新闻爬虫、google翻译、百度翻译、有道翻译、百度指数

    参考:https://www.yuanrenxue.com/crawler/news-crawler-urlpool.html url_pool.py # -*- coding: utf-8 -*- ...

  10. 安装翻译_百度翻译下载安装官方地址

    世界很复杂,百度更懂你百度翻译于2015年率先在世界上发布了互联网NMT(神经网络机器翻译)系统,引领机器翻译进入神经网络翻译时代,和传统的机器翻译相比,能够根据上下文合理调整用词,译文自然流畅,大幅 ...

最新文章

  1. openssl生成https证书
  2. Django学习小记[2] —— Model
  3. Ubuntu9.10 server 安装配置 vsftpd2.2.0 ftp服务器 并且 解决 putty 登陆 sshd 显示中文乱码
  4. jquery复选框组清空选中的值_jQuery获取复选框被选中数量及判断选择值的方法详解...
  5. 看懂这5幅图,研发效能分析和改进就容易了
  6. HTML+CSS+JS实现 ❤️3D建筑结构旋转特效❤️
  7. 步步为营-75-Cookie简介
  8. linux命令封装sh,shell脚本学习之调用脚本将文件打包zip的方法示例
  9. 旷视Face++与西交大成立AI联合实验室,郑南宁孙剑再续师徒缘
  10. 掩膜裁剪tif步骤_(8)空间数据投影变换、数据裁剪、拼接及提取
  11. 视频测试软件+视频测试硬件=视频质量测试解决方法+视频测试的重要性
  12. python实现一键换脸+源码+教程
  13. 采集日志实践-ELK以及filebeat配置解析
  14. 虚拟机服务器CPU授权,vSphere5全新的许可授权方式——CPU许可+vRAM授权
  15. 芥酸油酯的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  16. 【转】2000国家大地控制网
  17. 第一章 信息源泉——推介资料出处
  18. 知识蒸馏怎么用?召回-粗排篇
  19. 认知计算 Cognitive Computing
  20. flv文件格式分析FlvParse.exe

热门文章

  1. 鉴智机器人完成亿元人民币级别的A轮融资第二次交割,由深创投和厚雪基金联合领投
  2. 华为初级——名字的漂亮度
  3. 统计模型LM,GLM,GAM和GAMLSS
  4. 自动驾驶中点云配准常用方法
  5. 经典老歌-杜德伟《彩虹》
  6. 数字福建物联网首批重点实验室建设启动 厦门两所高校入围
  7. 阿里,腾讯,美团大佬的公众号,带你了解真实的一线大厂
  8. 游戏开发jenkins杂谈系列:windows系统下修改系统时间触发Build periodically设置的定时任务,往前调时间但不再执行定时任务的解决办法
  9. 用AI帮助小学一年级记住常用字
  10. 一文搞定Hive常用运算和函数