XMLDocument doc; doc.LoadFile("1.xml"); /************************************************************************/ /*获得子节点 通过rootElement得到根节点 或者通过F
irstchildElement()
默认是获得第
一个节点,也可以传递进参数
获取指定名字的
标签 根节点是doc的唯一子节点,因为xml只允许
一个根节点 */ /************************************************************************/ auto root = doc.RootElement(); doc.F
irstChildElement(); doc.F
irstChildElement("classes"); auto classDinxin = root->F
irstChildElement("class"); auto mems = classDinxin->F
irstChildElement("members"); /************************************************************************/ /* 遍历子节点并获得其
属性 通过NextSiblingElement获得下
一个成员 获得
一个节点的
属性方法很多: Attribute(char *)获得指定名字的
属性,返回字符串 IntAttrbute(char*)获得指定名字的
属性,返回整数,还有float,bool等等 其内部是依靠 mem->QueryAttribute;//
支持获得多种类型 mem->QueryDoubleAttribute等等获得具体类型值 query***
方法需要传递参数获得值,用起来比较麻烦,所以又封装了 Attribute(char *) IntAttrbute(char*)等
函数 mem->F
irstAttribute()获得第
一个属性 如果给定
一个属性,那么如何获得他的值 我们可以通过mem->F
irstAttribute()->Value();直接返回其字符串值 通过mem->F
irstAttribute()->QueryDoubleValue()等等获得其他类型的值 和节点类型一样,query
方法获得
属性的具体值比较麻烦,于是封装了下面类似 的
方法 mem->F
irstAttribute()->FloatValue(), 上面可以总结为两个问题: 节点如何
获取属性的值 获得的
属性如何取得其自身的值 值得注意的是:解析器解析后获得的值都是字符串类型的,解析器通过分析字符串值来获得具体的 其他值,如字符串值“123”,那么如果我们
调用doubleAttribute,内部的操作就是
调用函数,将字符串转为数值 通过attr = attr->Next();我们可以获得下
一个相邻的
属性 */ /************************************************************************/ { auto mem = mems->F
irstChildElement(); while (mem) { auto attr = mem->F
irstAttribute(); 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->F
irstChildElement(); std::cout << mem->GetText(); mem->IntText(); double d; } /************************************************************************/ /* 设置值 读取到内存中后,我们可以设置其值 */ /************************************************************************/ { auto mem = mems->F
irstChildElement(); mem->SetName("member"); mem->SetAttribute("name","羊绒");//多个重载,
支持多种值类型,实际上还是以字符串保存 mem->SetText(66666); } /************************************************************************/ /*新建节点和
属性以及text,并设置到
文件中 1、新建描述信息 auto declare = doc.NewDecl
aration(); doc.LinkEndChild(declare); doc.InsertF
irstChild(declare); doc.InsertEndChild(declare); 2、插入注释 mems->InsertF
irstChild(doc.NewComment(" 这描述了成员具体信息 ")); 3、新建节点,并设置值 auto newMem = doc.NewElement("member"); newMem->SetAttribute("name","Obama"); newMem->SetAttribute("id","1100301222"); newMem->SetText(88888); auto mem = mems->F
irstChildElement()->NextSiblingElement(); mems->InsertAfterChild(mem,newMem); */ /************************************************************************/ /************************************************************************/ /*
删除节点,
属性,text mems->DeleteChild(mems->F
irstChildElement()); auto mem = mems->F
irstChildElement(); 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.jb51.cc/xml/297009.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。