在iOS中 XML文件的解析和写入
来源:互联网 发布:安卓手机运行java应用 编辑:程序博客网 时间:2024/05/22 00:44
解析和写入xml文件常用到的工具,kissXML,touchXML,其中kissXML是基于touchXML封装的一个第三方库.这里主要以kissXML为例
写入和解析XML文件:
首先了解概念,xml中element是节点,Attribute是该节点的属性,创建节点时可以连同节点的值一起创建,同理属性: 张三 ,这样则可表示,节点name的值为张三,他有一个type的属性为string
其次分析xml,以上图为例,如何写一个这样的简单xml,首先确定这样的xml,根节点为:message,在message下面有个子节点:x,子节点下面还有个子节点:rect,rect是一个没有值,只有属性的子节点.
我们来写入xml,代码如下:
//创建根节点 NSXMLElement *name = [NSXMLElement elementWithName:@“message"]; //设置根节点的属性 [name addAttributeWithName:@"id" stringValue:@“SC6um-27"]; [name addAttributeWithName:@"to" stringValue:@“demo@winkkeebaoim/Spark 2.6.3”]; [name addAttributeWithName:@"from" stringValue:@“test1@lovejiajiao.com"]; //设置子节点 x,并添加xmlns属性 NSXMLElement *x = [NSXMLElement elementWithName:@"x"]; [x addAttributeWithName:@"xmlns" stringValue:@"http://version2software.com/protocol/whiteboard"]; //将x作为name的子节点 [name addChild:x]; //创建子节点rect并添加他的属性 NSXMLElement *childElement = [NSXMLElement elementWithName:@“rect"]; [childElement addAttributeWithName:@"id" stringValue:@“1385710972183/demo@winkeebaoim/Spark 2.6.3"]; [childElement addAttributeWithName:@"x" stringValue:@“191”]; [childElement addAttributeWithName:@"y" stringValue:@“131”]; [childElement addAttributeWithName:@"width" stringValue:@“107”]; [childElement addAttributeWithName:@"height" stringValue:@“89”]; //将childElement作为x的子节点 [x addChild:childElement];
由于本xml格式相对简单,解析的话不会很复杂,简单说一下
如果要取到rect里面的id属性的值,先去到x根节点的内容,然后继续解析到rect节点,如下
[[[message elementForName:@”x”] elementForName:@”rect”] attributeForName:@“id”];// elementsForName加s的方法是取到所有的x下面的子节点
如果遇到相对复杂的xml格式如图:
这个xml根节点为message,x为message的子节点,在x子节点的下面有image和properties两个子节点,最后在properties子节点中有很多个property这个节点且,property中都有两个子节点name和value,其中value的属性为string.
话不多说,我们现在写入部分,直接上写入代码:
我们重点看下properties节点的写入
//创建properties节点 NSXMLElement *properties = [NSXMLElement elementWithName:@“properties"]; //设置properties节点的属性 [name addAttributeWithName:@"xmlns" stringValue:@“…”]; //下面创建propery属性就要循环创建了 NSArray *nameArr//定义一个放name的数组 NSArray *valueArr//定义一个放value的数组 //循环创建节点 for (int i=0; i<10; i++) { NSXMLElement *property=[NSXMLElement elementWithName:@"property"]; NSXMLElement *name=[NSXMLElement elementWithName:@"name" stringValue:nameArr[i]]; NSXMLElement *value=[NSXMLElement elementWithName:@"value" stringValue:valueArr[i]]; [value addAttributeWithName:@"type" stringValue:@"string"]; [property addChild:name]; [property addChild:value]; [properties addChild:property]; }
对于这个xml解析出来的可能需要点功夫,我们可以先思考一下,对于结构复杂的xml解析的时候,要分清层级,可以采用一层一层的解析方法,这里我们以想要取出property里面的name和value为例
思路:我们可以将每个property里面的name和value作为一个字典对象,放入数组当中
//首先拿到x节点的内容 NSXMLElement *element=[message elementForName:@"x"]; //用数组保存x字节点的内容,这时shape里面是image和properties两个节点的内容 NSArray *shape=[element children]; //for in 遍历整个数组,找到你想要的节点properties for (CXMLElement *element in shapes){//判断是属于xml节点的类 if ([element isKindOfClass:[NSXMLElement class]]){ //判断该节点是我们所需要的节点 if ([[element name] isEqualToString:@“properties”]){ //创建一个数组盛放我们解析出来的所有字典对象 NSMutableArray *sourceArray = [NSMutableArray array]; //获取我们遍历到的properties下面的所有property的节点,放在数组里 NSArray *allSubNotes=[element elementsForName:@"property"]; //遍历这个数组,用字典取出每个数据,放入sourceArray数组中 for (CXMLElement *item in allSubNotes) { //每次循环开始的时候,说明是一个新的property节点,我们需要字典来盛放它所有的值 NSMutableDictionary *propertyDic = [NSMutableDictionary dictionary]; //得到所有name节点放入nameArray,注意如果有很多的name节点就这么写,如果只有一个name节点,那可以直接用 CXMLElement *nameElement=[item elementForName:@“name”],用不加s的方法 NSArray *nameArray = [item elementsForName:@"name"]; //解析name节点 CXMLElement *nameElement = [nameArray objectAtIndex:0]; //取出节点name的值 NSString *name = [nameElement stringValue]; //放入字典中 [studentDic setObject:name forKey:@"name"]; //取出value NSArray *ageArray = [item elementsForName:@"value"]; CXMLElement *valueElement = [ageArray objectAtIndex:0]; NSString *value = [valueElement stringValue]; [studentDic setObject:value forKey:@"value"]; //把property字典添加到数组中 [sourceArray addObject:propertyDic]; } } } }
最后我们可以打印 sourceArray 这个数组,那么他的内容将是如下格式
(//由于排版问题只显示了七组,上图是有十组数据的
{
name = wbimagefilesender;
value = pc;
},
{
name = filetype;
value = 1;
},
{
name = server;
value = “ftp.lovejiajiao.com”;
},
{
name = port;
value = 60001;
},
{
name = username;
value = imftp;
},
{
name = pwd;
value = “im.ftp.2014”;
},
{
name = path;
value = “/files/uid5902bb0000004a18Desert.jpg”;
},
{
name = filename;
value = “uid5902bb0000004a18Desert.jpg”;
},
)
- 在iOS中 XML文件的解析和写入
- dom4j解析xml和写入xml文件
- VC++中XML文件的解析读取写入
- iOS中xml文件解析
- IOS XML文件的读取与写入
- IOS XML文件的读取与写入
- Opencv中XML文件的写入
- android解析xml文件,并写入到短信中
- opencv2-XML和YAML文件的写入
- XML和YAML文件的写入
- 利用Java jdk(dom)解析和写入XML文件
- XML文件的写入和读取(解析)基于DOM4J工具
- iOS:XML文件的解析(SAX解析)
- XML文件的写入
- PDA中XML的读取和写入
- 【IOS中XML解析】NSXMLParser方法解析XML文件案例
- 在C#中如何创建写入XML文件示例
- ios中如何解析xml文件
- hdu 1032 The 3n+1 problem
- 题解——Leetcode 6. ZigZag Conversion 难度:Medium
- 2017-04-28欠博客一篇
- Ubuntu 查看端口占用情况
- linux command
- 在iOS中 XML文件的解析和写入
- 英语总结系列(二十八):改变自己
- SHTML 教程
- ios Signing for "" requires a development team. Select a development team in the project editor.
- jQuery_样式
- 初学C#之工具篇
- APP开发:封装TitleBar
- MyBatis 注解
- mybatis模糊查询问题