TinyXML

文档对象操作

从文件加载

#define XMLFILE "./config.xml"

TiXmlDocument XmlDoc = TiXmlDocument(XMLFILE);
if(XmlDoc.LoadFile()){
    //加载成功 to do ...
    //doc.Print();
}else{  
    if(XmlDoc.Error() == true){
        string strErrot = XmlDoc.ErrorDesc();  //错误原因
        int iRow = XmlDoc.ErrorRow();          //错误的行
        int iCol = XmlDoc.ErrorCol();            //错误的列
    }
    // 加载解析失败 to do ...
}

从字符串中加载

    extern const char * cDoc;  // 被解析的字符串
    
    TiXmlDocument XmlDoc;
    XmlDoc.Parse(cDoc);
    if(XmlDoc.Error() == true){
        string strErrot = XmlDoc.ErrorDesc();
        int iRow = XmlDoc.ErrorRow();
        int iCol = XmlDoc.ErrorCol();
        // 加载解析失败 to do ...
    }

保存在文件中

    #define XMLFILE "./config.xml"
    extern TiXmlDocument XmlDoc;
    
    //存在其他文件 
    if(XmlDoc.SaveFile (XMLFILE) == false){
       // 写入文件失败 to do ...
    }
    //保存在本文件
    if(XmlDoc.SaveFile () == false){
       // 写入文件失败 to do ...
    }

保存在字符串中

    TiXmlDocument XmlDoc;
    
    TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
    XmlDoc.LinkEndChild( decl ); 
    
    TiXmlPrinter printer;                           
    XmlDoc.Accept( &printer );                 //文档设置观察者
    std::string stringBuffer = printer.CStr();   //获取字符串

元素操作

遍历元素

   string strElementName;
   //定位到父元素位置
    TiXmlHandle hXmlHandle = TiXmlHandle(&XmlDoc);
    TiXmlElement* pFatherElement = hXmlHandle.FirstChild("ToDo").Child( "Item",0).ToElement();
    
    if(pFatherElement){
        for(TiXmlElement *pChildElement = pFatherElement->FirstChildElement();\
            pChildElement;\
            pChildElement = pChildElement->NextSiblingElement(strElementName)){
            // 对子元素进行操作pChildElement to do;
        }
    }else{
        //无法定位到元素
    }

添加元素

     //定位到父元素位置
    TiXmlHandle hXmlHandle = TiXmlHandle(&XmlDoc);
    TiXmlElement* pFatherElement = hXmlHandle.FirstChild("ToDo").Child( "Item",0).ToElement();
    
    TiXmlNode *pXmlChildNote = pFatherElement->InsertEndChild(TiXmlElement("bold2"));
    if(pXmlChildNote){
        //插入成功 
    }

删除元素

    //定位到父元素位置
    TiXmlHandle hXmlHandle = TiXmlHandle(&XmlDoc);
    TiXmlElement* pFatherElement = hXmlHandle.FirstChild("ToDo").ToElement();
    
    if(pFatherElement->RemoveChild(pFatherElement->FirstChild("Item")) == false){
        //删除失败
    }

元素文本操作

查看元素文本

    // 获取父节点
    TiXmlHandle hXmlHandle = TiXmlHandle(&XmlDoc);
    TiXmlNode* pNodeTodo = TiXmlHandle.FirstChild("ToDo").Node();
    
    if(pNodeTodo){
        //遍历节点
        for(TiXmlNode *pChildNode = pNodeTodo->FirstChild(); \
             pChildNode;\
             pChildNode = pChildNode->NextSibling()){
            //判断节点类型是否为文本
            if(pChildNode->Type() == TiXmlNode::TINYXML_TEXT){
                //获取到文本
               string strValue = pChildNode->ValueStr();
               break;                           //一般是只有一个文本,多个就把break注释掉
            }
        }
    }else{
      //无法定位到元素
    }

添加元素文本

    //定位到元素
    TiXmlHandle hXmlHandle = TiXmlHandle(&XmlDoc);
    TiXmlElement* pXmlElement = hXmlHandle.FirstChild("ToDo").Child( "Item",0).ToElement();
    
    if (pXmlElement){ 
        //获取到元素文本 strText
        pXmlElement->InsertEndChild(TiXmlText("123"));
    }else{
        //无法定位到元素
    }

删除元素文本

    //定位到元素
    TiXmlHandle hXmlHandle = TiXmlHandle(&XmlDoc);
    TiXmlNode* pXmlTextNode = hXmlHandle.FirstChild("ToDo").FirstChild().Node();
    //判断节点类型是否问文本
    if(pXmlTextNode){
        if(pXmlTextNode->Type() == TiXmlNode::TINYXML_TEXT){
            if(pXmlTextNode->Parent()->RemoveChild(pXmlTextNode) == false){
                //删除失败
            }else{
                //删除成果
            }
        }else{
            //非无文本,放弃
        }
    }else{
        //无法定位到元素
    }

修改元素文本

    string strValue;
    //定位到元素
    TiXmlHandle hXmlHandle = TiXmlHandle(&XmlDoc);
    TiXmlNode* pXmlTextNode = hXmlHandle.FirstChild("ToDo").FirstChild().Node();
    //判断节点类型是否问文本
    if(pXmlTextNode){
        if(pXmlTextNode->Type() == TiXmlNode::TINYXML_TEXT){
            pNodeText->SetValue(strValue);
        }else{
            //非无文本,放弃
        }
    }else{
        //无法定位到元素
    }

元素属性

查看元素属性

查数字属性

    extern string AttrName; //属性名
    //获取元素
    TiXmlHandle hXmlHandle = TiXmlHandle(&XmlDoc);
    TiXmlElement* pXmlElement = hXmlHandle.FirstChild("ToDo").Child( "Item",0).ToElement();
    
    if ( pXmlElement ){ 
        int iValue = 0;
       //查看字符串类型的属性
       //if(installFile->QueryStringAttribute(AttrName,&strValue) == 0) 
       //查看数字类型的属性
        if(installFile->QueryIntAttribute(AttrName,&iValue) == 0)          {
            // 获取的数字类型属性    iValue
        }
        else{   
            //获取失败
        }
    }else{
        //无法定位到元素
    }

添加与修改元素属性

     string strAttrName; //属性名
     string strAttrValue; //string类型属性值
     int  iAttrValue;       //int 类型属性值
     //获取元素
    TiXmlHandle hXmlHandle = TiXmlHandle(&XmlDoc);
    TiXmlElement* pXmlElement = hXmlHandle.FirstChild("ToDo").Child( "Item",0).ToElement();
	if ( pXmlElement ){ 
        int iValue = 0;
        //添加或修改属性
        pXmlElement->SetAttribute(strAttrName,iAttrValue);
        //pXmlElement->SetAttribute(strAttrName, strAttrValue);    string类型的属性
    }else{
        //无法定位到元素
    }

删除元素属性

     string strAttrName; //属性名
     //获取元素
    TiXmlHandle hXmlHandle = TiXmlHandle(&XmlDoc);                                                                   
    TiXmlElement* pXmlElement = hXmlHandle.FirstChild("ToDo").Child( "Item",0).ToElement();
     if ( pXmlElement ){ 
        int iValue = 0;
        //添加或修改属性
        pXmlElement->RemoveAttribute(strAttrName);
    }else{
        //无法定位到元素
    }

XML与TinyXML简介

XML简介

  • XML被设计用来传输和存储数据
  • HTML被设计用来显示数据。
  • XML是一种标记语言,很类似 HTML
  • 标签没有被预定义。您需要自行定义标签
  • XML是树结构,必须要有根元素
  • XML由声明、注释、元素、属性、文本构成

XML语法

  1. 基础语法
  • XML 文档必须有根元素
  • 所有的 XML 元素都必须有一个关闭标签
  • XML 标签对大小写敏感
  • XML 属性值必须加引号
  • 在 XML 中,空格会被保留
  • 所有 XML 文档中的文本均会被解析器解析。只有CDATA区段中的文本会被解析器忽略。
  1. XML声明

    <?xml version="1.0" encoding="utf-8"?>
  2. XML中的注释

  3. 实体应用

在 XML 中,一些字符拥有特殊的意义。如果把字符 “<” 放在 XML 元素中,会发生错误

替代符号原符号含义
<<less than
>>greater than
&&ampersand
'apostrophe
""quotation mark
  1. XML 以 LF 存储换行

在 Windows 应用程序中,换行通常以一对字符来存储:回车符(CR)和换行符(LF)。
在 Unix 和 Mac OSX 中,使用 LF 来存储新行。

XML元素

  1. 元素可以包含哪些东西
  • 其他元素
  • 文本
  • 属性
  1. 元素的命名规则
  • 名称可以包含字母、数字以及其他的字符名称
  • 不能以数字或者标点符号开始名称
  • 不能以字母 xml(或者 XML、Xml 等等)开始名称
  • 不能包含空格
  1. 最佳命名习惯
  • 建议使用下划线的名称
  • 避免 “-” 字符。如果您按照这样的方式进行命名:“first-name”,一些软件会认为您想要从 first 里边减去 name。
  • 避免 “.” 字符。如果您按照这样的方式进行命名:“first.name”,一些软件会认为 “name” 是对象 “first” 的属性。
  • 避免 “:” 字符。冒号会被转换为命名空间来使用(稍后介绍)。
  • 使用数据库的命名规则来命名 XML 文档中的元素。
  • 在 XML 中,éòá 等非英语字母是完全合法的,不过需要留意,您的软件供应商不支持这些字符时可能出现的问题。

XML属性

  1. 定义

属性通常提供不属于数据组成部分的信息。在下面的实例中,文件类型与数据无关,但是对需要处理这个元素的软件来说却很重要:

  1. 元素 vs 属性

尽量用元素,元素具有扩展性

TinyXML 文档

英文文档

http://www.grinninglizard.com/tinyxmldocs/index.html

中文文档

https://www.cnblogs.com/flying_bat/archive/2007/11/10/955327.html

文档总结

  1. 使用STL

TinyXML可以被编译成使用或不使用STL,在tinyxml.h的第一行添加"#define TIXML_USE_STL"

  1. 打印输出
  • Print( FILE* ):输出到一个文件流中,包括所有的C文件和标准输出。
  • operator<<:输出到一个c++流中。
  • TiXmlPrinter:输出到一个std::string或者内存缓冲区中。
  1. 句柄

句柄可以直接访问某个节点,无需一层一层的剥开

TiXmlHandle docHandle( &document );
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
if ( child2 )
{
}
  1. 行列追踪

TiXmlBase::Row() 和 TiXmlBase::Column() 方法返回结点在源文件中的原始位置。
正确的制表符号可以经由TiXmlDocument::SetTabSize() 来配置。

  1. 使用与安装
    1. Windows项目文件
      • tinyxml: tinyxml 库,非STL
      • tinyxmlSTL: tinyxml 库,STL
    2. Makefile
      • 设置:PROFILE,DEBUG,和TINYXML_USE_STL。
    3. 使用
      • TiXmlDocument 文件
      • TiXmlDeclaration 声明
      • TiXmlComment 注释
      • TiXmlElement 元素
      • TiXmlElement::Attribtutes 元素的属性

TinyXML 常用接口

类列表

类图
  • TiXmlBase
    • TiXmlAttribute
    • TiXmlNode
      • TiXmlComment
      • TiXmlDeclaration
      • TiXmlDocument
      • TiXmlElement
      • TiXmlText
      • TiXmlUnknown
  • TiXmlHandle
  • TiXmlVisitor
    • TiXmlPrinter
作用
TiXmlAttribute一个属性是一对 name-pair 键值对
TiXmlBase所有类的基类
TiXmlCommentXML注释
TiXmlDeclaration首行声明
TiXmlDocumentXML文件类,可以是真的文件,可以是XML成员
TiXmlElement元素类
TiXmlHandle句柄类,可以直接访问某个节点
TiXmlNode内容的父类
TiXmlPrinter输出到内存中
TiXmlTextXML 文本
TiXmlUnknown所有无法识别的标记都会存放在unknow中
TiXmlVisitor实现访问者模式的接口

TiXmlBase

接口作用
virtual void Print(FILE *cfile, int depth)输出到文件
int Row()获取对象所在行
int Column()获取对象所在列
void SetUserData(void *user)
void *GetUserData()
static void SetCondenseWhiteSpace(bool condense)是否保留空白
static bool IsWhiteSpaceCondensed()查看空白设置
static void EncodeString(const TIXML_STRING &str, TIXML_STRING *out)设置编码格式
TiXmlAttribute (属性)接口

构造接口

接口作用
TiXmlAttribute(const std::string &_name, const std::string &_value)还有个const char* 接口

查看接口

接口作用
const char * Name()
const char* Value()
string ValueStr()
int QueryIntValue(int * _value)成功 返回 TIXML_SUCCESS,并将结果存在 value中
int QueryDoubleValue(double * _value)同上

设置接口

接口作用
void SetName(const char * _name)
void SetValue(const char * _name)
void SetIntValue(const char * _name)
void SetDoubleValue(const char * _name)

其他接口

接口作用
const TiXmlAttribute*\Next()下一个属性
const TiXmlAttribute*\Previous()上一个属性
TiXmlNode 节点

"树访问"接口

接口作用
TiXmlNode * Parent ()父节点
const TiXmlNode * FirstChild () const子节点
const TiXmlNode * FirstChild (const char *value) const特定“值”的子节点,有value的都是访问特定值
TiXmlNode * LastChild ()最后一个节点
TiXmlNode * LastChild (const char *_value)特定值得 最后一个节点
const TiXmlNode * IterateChildren (const TiXmlNode *previous)用于遍历 while( child = parent->IterateChildren( child ) )
const TiXmlNode * IterateChildren (const char *value, const TiXmlNode *previous)用于遍历,特定值
const TiXmlNode * PreviousSibling ()前一个兄弟节点
const TiXmlNode * PreviousSibling (const char *) const特定值前一个兄弟节点
const TiXmlNode * NextSibling (const std::string &_value) const特定值后一个兄弟节点
const TiXmlNode * NextSibling () const后一个兄弟节点
const TiXmlElement * NextSiblingElement ()后一个兄弟元素
const TiXmlElement * NextSiblingElement (const char *) const后一个兄弟元素
const TiXmlElement * FirstChildElement () const第一个元素
const TiXmlElement * FirstChildElement (const char *_value) const第一个特定值元素
virtual bool Accept (TiXmlVisitor *visitor) const =0访问者模式访问

“树操作”接口

接口作用
TiXmlNode * InsertEndChild (const TiXmlNode &addThis)尾部插入
TiXmlNode * LinkEndChild (TiXmlNode *addThis)尾部插入

|TiXmlNode * InsertBeforeChild (TiXmlNode *beforeThis, const TiXmlNode &addThis)|向前插入
|TiXmlNode * InsertAfterChild (TiXmlNode *afterThis, const TiXmlNode &addThis)|向后插入|
|TiXmlNode * ReplaceChild (TiXmlNode *replaceThis, const TiXmlNode &withThis)|替换节点|
|bool RemoveChild (TiXmlNode *removeThis)|删除节点|

“节点”操作

接口作用
void SetValue (const std::string &_value)设置值,常用于文本设置
const std::string & ValueStr () const获取值
int Type () const判断类型
const TiXmlDocument * GetDocument () const
bool NoChildren () const判断有子节点
virtual TiXmlNode * Clone () const=0节点复制并返回

格式转换

接口作用
virtual const TiXmlDocument * ToDocument () const转文档
virtual const TiXmlElement * ToElement () const转元素
virtual const TiXmlComment * ToComment () const转注释
virtual const TiXmlUnknown * ToUnknown () const转未知
virtual const TiXmlText * ToText () const转文本
virtual const TiXmlDeclaration * ToDeclaration () const转属性
TiXmlDeclaration 声明
接口作用
TiXmlDeclaration (const char *_version, const char *_encoding, const char *_standalone)有参构造
const char * Version () const版本
const char * Encoding () const编码格式
const char * Standalone () const是否时独立文件
TiXmlDocument 文档

加载与保存文件

接口作用
TiXmlDocument (const char *documentName)有参构造
bool LoadFile (TiXmlEncoding encoding=TIXML_DEFAULT_ENCODING)加载文件,已指定文件
bool SaveFile () const保存文件,已指定文件
bool LoadFile (const char *filename, TiXmlEncoding encoding=TIXML_DEFAULT_ENCODING)加载文件,未指定文件
bool SaveFile (const char \filename)保存文件,未指定文件
bool LoadFile (FILE , TiXmlEncoding encoding=TIXML_DEFAULT_ENCODING)加载文件,根据文件句柄
bool SaveFile (FILE *) const保存文件,根据文件句柄
void Print () const输出标准输出中

错误

接口作用
bool Error () const是否有错
const char * ErrorDesc () const错误描述
int ErrorId () const无用
int ErrorRow () const错误的行
int ErrorCol () const错误的列

其他

接口作用
void SetTabSize (int _tabsize)设置tab的空格数
const TiXmlElement * RootElement () const获取跟节点
virtual const char * Parse (const char *p, TiXmlParsingData *data=0, TiXmlEncoding encoding=TIXML_DEFAULT_ENCODING)字节流 解析
TiXmlElement 元素

查询属性接口

接口作用
int QueryIntAttribute (const char *name, int *_value) constint 类型属性,return 0 表示成功,value 为出参
int QueryDoubleAttribute (const char *name, double *_value) constdouble 类型属性
int QueryFloatAttribute (const char *name, float *_value) constfloat 类型属性
int QueryStringAttribute (const char *name, std::string *_value) conststring 类型属性
int QueryValueAttribute (const std::string &name, T *outValue) const自定义类型属性

设置属性接口

接口作用
void SetAttribute (const char *name, const char *_value)设置 属性
void SetAttribute (const char *name, int value)设置int 类型属性
void SetDoubleAttribute (const char *name, double value)设置 double类型属性

其他接口

接口作用
TiXmlElement (const char *in_value)
void RemoveAttribute (const std::string &name)删除属性
const char * GetText () const读取元素得文本信息
TiXmlText
接口作用
TiXmlText (const char *initValue)
void SetCDATA (bool _cdata)设置CDATA
bool CDATA () const是否设置CDATA

TiXmlHandle 用于快速读取

"树访问"接口

接口作用
TiXmlHandle (TiXmlNode *_node)从一个节点获取句柄
const TiXmlNode * FirstChild () const第一个子节点
const TiXmlNode * FirstChild (const char *value) const第一个特定“值”的子节点
const TiXmlElement * FirstChildElement () const第一个元素
const TiXmlElement * FirstChildElement (const char *_value) const第一个特定值元素
TiXmlHandle Child (int index) const定点读取访问子节点
TiXmlHandle Child (const char *value, int index) const定点读取访问“特定值”的子节点
TiXmlHandle ChildElement (int index) const定点访问子元素
TiXmlHandle ChildElement (const char *value, int index) const定点访问“特定值”子元素

格式转换

接口作用
virtual const TiXmlElement * ToElement () const转元素
virtual const TiXmlComment * ToComment () const转注释
virtual const TiXmlUnknown * ToUnknown () const转未知
virtual const TiXmlText * ToText () const转文本

注意事项

  • 使用TiXmlElement::GetText()方法,文本必须为第一个子节点(包含注释,注释也是一个节点),否则只用使用TiXmlNode::ValueStr()方法
  • 文本的读取在node类(TiXmlNode::ValueStr())和element类(TiXmlElement::GetText()),文本的设置在node(TiXmlNode::SetValue (const std::string &_value))类中
    (const char *value, int index) const | 定点访问“特定值”子元素 |
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值