本文主要分享的是循环方法的使用,设置XML节点属性,用了3种循环方法。

XML文件:

<?xml version='1.0' encoding='utf-8' ?>
<root>
<seqs>
<seq name="a" license="1" enable="true"/>
<seq name="b" license="1" enable="true"/>
</seqs>
</root>

第一种方法:以vecSeq大小作为循环条件,最方便,因为可以直接使用int i

#include <iostream> 
#include "rapidxml/rapidxml.hpp" 
#include "rapidxml/rapidxml_utils.hpp" 
#include "rapidxml/rapidxml_print.hpp" 
#include "boost/property_tree/xml_parser.hpp"

using namespace rapidxml;

struct SeqStruct
{
std::string seqName;
std::string seqLicense;
};

int main()
{
SeqStruct seqs;
std:: vector<SeqStruct> vecSeq;
seqs.seqName = "zhang";
seqs.seqLicense = "true";
vecSeq.push_back(seqs);
seqs.seqName = "liu";
seqs.seqLicense = "true";
vecSeq.push_back(seqs);

for(int i = 0; i < 2; i++)
{
std::cout <<vecSeq[i].seqName;
std::cout <<vecSeq[i].seqLicense;
std::cout << std::endl;
}

file<> fDoc("E:/UIMRIS/BRANCHES/uMR_MAIN/MAIN/Features/win32test/XMLFile6.xml");
std::cout << fDoc.data() << std::endl;
xml_document<> xmlDoc;
xmlDoc.parse<0>(fDoc.data());

xml_node<>* rootNode = xmlDoc.first_node();
xml_node<>* seqsNode = rootNode->first_node();

xml_node<>* seqNode = seqsNode->first_node();

for (int i = 0; i < vecSeq.size(); ++i)
{
xml_attribute<>* attrSeq = seqNode->first_attribute();
attrSeq->value(xmlDoc.allocate_string(vecSeq[i].seqName.c_str()));

attrSeq = attrSeq->next_attribute();
attrSeq->value(xmlDoc.allocate_string(vecSeq[i].seqLicense.c_str()));

seqNode = seqNode->next_sibling();
}
std::string text;
rapidxml::print(std::back_inserter(text), xmlDoc, 0); 
std::cout<<text<<std::endl; 
std::ofstream out("E:/UIMRIS/BRANCHES/uMR_MAIN/MAIN/Features/win32test/XMLFile7.xml"); 
if (!out.good())
{
std::cout<<"error";
}
out << text; 
out.close();

getchar();

return 0;
}

第二种方法:以节点指向为循环,但是需要重新定义一个int i

int i = 0;
for (xml_node<>* seqNode = seqsNode->first_node(); seqNode != NULL; seqNode = seqNode->next_sibling())
{
xml_attribute<>* attrSeq = seqNode->first_attribute();
attrSeq->value(xmlDoc.allocate_string(vecSeq[i].seqName.c_str()));

attrSeq = attrSeq->next_attribute();
attrSeq->value(xmlDoc.allocate_string(vecSeq[i].seqLicense.c_str()));
i++;
}

第三种方法:节点属性也作为循环,因为有3个属性,只操作前两个属性,所以要加判断条件

int i = 0;
for (xml_node<>* seqNode = seqsNode->first_node(); seqNode != NULL; seqNode = seqNode->next_sibling())
{

for (xml_attribute<>* attrSeq = seqNode->first_attribute(); attrSeq->next_attribute() != NULL; attrSeq = attrSeq->next_attribute()) //only change 2 attribute
{
if (bFirst)
{
attrSeq->value(xmlDoc.allocate_string(vecSeq[i].seqName.c_str()));
bFirst = false;
}
else
{
attrSeq->value(xmlDoc.allocate_string(vecSeq[i].seqLicense.c_str()));
bFirst = true;
}
}
i++;
}

利用c++操作XML,主要是内部循环方法的使用的更多相关文章

  1. 利用XmlDocument操作XML文件

    利用XmlDocument可以方便的操作XML文件. .操作XML文件基本方法 ()添加对System.Xml的引用,并使用using语句添加引用: ()假设要读取的XML文件如下: <?xml ...

  2. c#操作XML文件的通用方法

    转载地址:http://www.studyofnet.com/news/36.html 原址没找到 sing System; using System.Data; using System.Confi ...

  3. PHP DOMDocument操作 XML类 属性、方法

    属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataType 返回此节点的数据类型 Definition 以DTD或XML模式给出的节 ...

  4. Jquery 操作xml 文档的方法

    需求: 页面上有两个下拉框,显示游戏大区 和游戏服务器,当游戏大区改变时,游戏服务器也跟着改变 界面部分html代码 <tr class="tkSigUser"> &l ...

  5. java使用dom4j和XPath解析XML与.net 操作XML小结

    最近研究java的dom4j包,使用 dom4j包来操作了xml 文件 包括三个文件:studentInfo.xml(待解析的xml文件), Dom4jReadExmple.java(解析的主要类), ...

  6. C#操作XMl文件(2):使用XmlReader和XmlWriter实现读取和写入

    这次使用操作Xml较为常用的方法:使用XMlreader和Xmlwriter 1:读取xml文件的数学和元素 XmlReaderSettings settings = new XmlReaderSet ...

  7. Asp.Net 操作XML文件的增删改查 利用GridView

    不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...

  8. C#操作XML方法集合

    一 前言 先来了解下操作XML所涉及到的几个类及之间的关系  如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家 * 1 XMLElement 主要是针对节点的一些属性进行操 ...

  9. C#操作XML方法详解

    using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument();   //导入指定xml文件 xml.Load(path); xml. ...

随机推荐

  1. ubuntu如何跑arm程序

    1. 首先确定一间配置好arm linux 交叉编译器,可以使用arm-linux-gcc. 2. 看示例代码hello.c #include<stdio.h> int add(int a ...

  2. opencv 中文文档地址

    http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html

  3. 30种mysql优化sql语句查询的方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  4. [一位菜鸟的COCOS-2D编程之路]COCOS2D中得动作,特效和动画

    一,CCActionManager 管理所有节点动作的对象 来看看打飞机里面的一个onEnter 方法 - (void)onEnter { [super onEnter]; //一定要注意添加此方法, ...

  5. IOS开发之UINavigationController详解

    UINavigationController是IOS编程中比较常用的一种容器view controller,很多系统的控件(如UIImagePickerViewController)以及很多有名的AP ...

  6. iOS 更好用的打Log方式-显示文件名、行数

    单纯的NSLog方式打出的Log没有显示打印语句所在的文件名和行数,下面这种做法会很实用: #ifdef DEBUG # define DLog(fmt, ...) NSLog((@"%s ...

  7. 是否以某字符串结尾 是否以某字符串开始 是否是整数 裁减字符串空格 是否是浮点数 是否所有字符为数字类型 是否为空 是否是EMAIL 是否是电话号码 身份证号码验证-支持新的带x身份证 日期验证

    /* 1.是否以某字符串结尾 endsWith(theStr,endStr) @param theStr:要判断的字符串 @param endStr:以此字符串结尾 @return boolean; ...

  8. 以色列学生---debugger 构建

    http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1 http://eli.thegreenplace.net/

  9. How and Why Unsafe is Used in Java---reference

    By Peter Lawrey https://www.voxxed.com/blog/2014/12/how-and-why-unsafe-is-used-in-java/ Overview sun ...

  10. vi 快捷键

    屏幕翻滚类命令Ctrl+u:向文件首翻半屏Ctrl+d:向文件尾翻半屏Ctrl+f:向文件尾翻一屏Ctrl+b:向文件首翻一屏 shift+g:到尾部 H:跳到第一行.M:跳到中间.L:跳到最后一行. ...