XMLDocument doc; doc.LoadFile("1.xml"); /************************************************************************/ /*获得子节点 通过rootElement得到根节点 或者通过FirstchildElement() 默认是获得第一个节点,也可以传递进参数
获取指定名字的
标签 根节点是doc的唯一子节点,因为xml只允许一个根节点 */ /************************************************************************/ auto root = doc.RootElement(); doc.FirstChildElement(); doc.FirstChildElement("classes"); auto classDinxin = root->FirstChildElement("class"); auto mems = classDinxin->FirstChildElement("members"); /************************************************************************/ /* 遍历子节点并获得其
属性 通过NextSiblingElement获得下一个成员 获得一个节点的
属性方法很多: Attribute(char *)获得指定名字的
属性,返回字符串 IntAttrbute(char*)获得指定名字的
属性,返回整数,还有float,bool等等 其内部是依靠 mem->QueryAttribute;//
支持获得多种类型 mem->QueryDoubleAttribute等等获得具体类型值 query***
方法需要传递参数获得值,用起来比较麻烦,所以又封装了 Attribute(char *) IntAttrbute(char*)等
函数 mem->FirstAttribute()获得第一个
属性 如果给定一个
属性,那么如何获得他的值 我们可以通过mem->FirstAttribute()->Value();直接返回其字符串值 通过mem->FirstAttribute()->QueryDoubleValue()等等获得其他类型的值 和节点类型一样,query
方法获得
属性的具体值比较麻烦,于是封装了下面类似 的
方法 mem->FirstAttribute()->FloatValue(), 上面可以总结为两个问题: 节点如何
获取属性的值 获得的
属性如何取得其自身的值 值得注意的是:解析器解析后获得的值都是字符串类型的,解析器通过分析字符串值来获得具体的 其他值,如字符串值“123”,那么如果我们
调用doubleAttribute,内部的操作就是
调用函数,将字符串转为数值 通过attr = attr->Next();我们可以获得下一个相邻的
属性 */ /************************************************************************/ { auto mem = mems->FirstChildElement(); while (mem) { auto attr = mem->FirstAttribute(); while (attr) { std::cout << attr->Name() << attr->Value(); attr = attr->Next(); } mem = mem->NextSiblingElement(); } } /************************************************************************/ /* 获得和设置节点的text mem->GetText();
获取字符串值, 通过query***
函数来
获取具体值 double d; mem->QueryDoubleText(&d); 在原本的引擎中,只有query***
函数来
获取具体值,笔者这里在原来的引擎中
添加了和上述
获取属性值类似的
方法 来简化
获取text的具体值 mem->IntText(); */ /************************************************************************/ { auto mem = mems->FirstChildElement(); std::cout << mem->GetText(); mem->IntText(); double d; } /************************************************************************/ /* 设置值 读取到内存中后,我们可以设置其值 */ /************************************************************************/ { auto mem = mems->FirstChildElement(); mem->SetName("member"); mem->SetAttribute("name","羊绒");//多个重载,
支持多种值类型,实际上还是以字符串保存 mem->SetText(66666); } /************************************************************************/ /*新建节点和
属性以及text,并设置到
文件中 1、新建描述信息 auto declare = doc.NewDeclaration(); doc.LinkEndChild(declare); doc.InsertFirstChild(declare); doc.InsertEndChild(declare); 2、插入注释 mems->InsertFirstChild(doc.NewComment(" 这描述了成员具体信息 ")); 3、新建节点,并设置值 auto newMem = doc.NewElement("member"); newMem->SetAttribute("name","Obama"); newMem->SetAttribute("id","1100
301222"); newMem->SetText(88888); auto mem = mems->FirstChildElement()->NextSiblingElement(); mems->InsertAfterChild(mem,newMem); */ /************************************************************************/ /************************************************************************/ /*
删除节点,
属性,text mems->DeleteChild(mems->FirstChildElement()); auto mem = mems->FirstChildElement(); mem->DeleteAttribute("name"); mems->DeleteChildren();//
删除所有子节点 没有
删除text的
属性,我们只需要把text设置为空字符串即可 */ /************************************************************************/ /************************************************************************/ /*
修改现有
属性值? 遗憾的是,没有具体的
函数实现这种
功能,我们只可以用setAttribute
函数把
属性名字和值都设置一遍 */ /************************************************************************/ /************************************************************************/ /* 用字符串新建xml */ /************************************************************************/ char xml[] = { "<?xml version='1.0' encoding='gb2312' ?>" "<!-- gameInfo -->" "<game>" "<info>" "<name>" "angry birds" "</name>" "<size>" "23M" "</size>" "</info>" "</game>" }; XMLDocument dd; dd.Parse(xml); dd.SaveFile("2.xml"); //
修改都是在内存中进行的,
修改后记得保存偶 doc.SaveFile("1.xml"); return 0; }
原文链接:https://www.f2er.com/xml/297009.html