项目作者: MxABC

项目描述 :
xml convert to jsonmodel(XML parsing), jsonmodel convert to xml(xml writer)
高级语言: Objective-C
项目地址: git://github.com/MxABC/LBXMLModel.git
创建时间: 2021-01-17T07:22:11Z
项目社区:https://github.com/MxABC/LBXMLModel

开源协议:MIT License

下载


LBXMLModel

xml 与model相互转换,达到类似YYModel使用效果,
基于XMLReaderXMLWriterYYModel修改而成

安装

  • cocoapods安装
  1. pod 'LBXMLModel'
  • 手动安装

LBXMLModel文件夹copy到工程

调用

包含头文件 NSObject+LBXMLModel.h

xml->model

  1. NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];
  2. NSData *dataXML = [NSData dataWithContentsOfFile:path];
  3. //xml ->model
  4. RootModel *model = [RootModel jsonModelWithXML:dataXML];

model->xml

  1. RootModel *rootModel = [[RootModel alloc]init];
  2. //TODO: 初始化model值
  3. NSData *xmlData = [rootModel jsonModelToXMLData:YES];
  4. NSString* strXML = [[NSString alloc]initWithData:xmlData encoding:NSUTF8StringEncoding];
  5. NSLog(@"%@",strXML);

model定义注意事项

常用xml报文格式

xml数据只是标签内容,没有标签属性,那么直接按照YYModel使用注意事项即可

如类似如下xml报文,各个标签没有属性(大部分情况都是如此),model定义只要按照YYModel要求即可

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <root>
  3. <RESPONSE_CODE>200</RESPONSE_CODE>
  4. <RESPONSE_MSG>上传成功</RESPONSE_MSG>
  5. <NODE>
  6. <PAGEID>page1<PAGEID></PAGEID>
  7. <FILE_NAME>FILE_NAME_123.jpg<FILE_NAME></FILE_NAME>
  8. </NODE>
  9. <TITLE>titl1</TITLE>
  10. <TITLE>titl2</TITLE>
  11. </root>

对应model定义

  1. @interface NODEModel : NSObject
  2. @property (nonatomic, copy) NSString *PAGEID;
  3. @property (nonatomic, copy) NSString *FILE_NAME;
  4. @end
  5. @interface ResModel : NSObject
  6. @property (nonatomic, assign) NSInteger RESPONSE_CODE;
  7. @property (nonatomic, copy) NSString *RESPONSE_MSG;
  8. //有可能是数组的,均写成数组形式
  9. @property (nonatomic, strong) NSArray<NODEModel*> *NODE;
  10. @property (nonatomic, strong) NSArray<NSString*> *TITLE;
  11. @end
  12. @interface RootModel : NSObject
  13. @property (nonatomic, strong) ResModel *root;
  14. @end
  1. @implementation NODEModel
  2. @end
  3. @implementation ResModel
  4. + (NSDictionary *)modelContainerPropertyGenericClass {
  5. return @{@"NODE":[NODEModel class]
  6. };
  7. }
  8. @end
  9. @implementation RootModel
  10. + (NSDictionary *)modelContainerPropertyGenericClass {
  11. return @{@"root" : [ResModel class]
  12. };
  13. }
  14. @end

如果标签包含属性

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <root>
  3. <NODE>
  4. <SUBNODE>subnode</SUBNODE>
  5. <PAGE PAGEID="11-22-33-44-66" FILE_NAME="filename3.jpg"></PAGE>
  6. <PAGE PAGEID="11-22-33-44-77" FILE_NAME="filename.xml"></PAGE>
  7. </NODE>
  8. <RESPONSE_MSG>上传成功</RESPONSE_MSG>
  9. <RESPONSE_CODE>200</RESPONSE_CODE>
  10. <PAGE PAGEID="11-22-33-44" FILE_NAME="filename1.doc"></PAGE>
  11. <PAGE PAGEID="11-22-33-44-55" FILE_NAME="filename2.pdf"></PAGE>
  12. <TITLE>titl1</TITLE>
  13. <TITLE>titl2</TITLE>
  14. <TagARRAY>
  15. <TagSubARRAY subTitle="st1">subArray1</TagSubARRAY>
  16. </TagARRAY>
  17. <TagARRAY>
  18. <TagSubARRAY>subArray3</TagSubARRAY>
  19. <TagSubARRAY>subArray4</TagSubARRAY>
  20. </TagARRAY>
  21. </root>
  22. 1、如果xml报文只是从服务器接收到用来解析(xml->jsonmodel)
  23. 1)、有标签属性,且没有标签内容(大部分情况都是如此),如上面的xml报文中的PAGE标签,那么定义
  24. Model和json报文定义model没有区别
  25. 2)、如果有标签属性且有标签内容,如上图的TagSubARRAY,包含属性 subTitle,且有内容
  26. subArray1,那么model需要定义字段为`NSString *tag_content_text`来表示标签内容,
  27. 也可以通过YYModel提供的mapper方法自定义名称,如下面方法修改为名称text
  28. + (NSDictionary *)modelCustomPropertyMapper {
  29. return @{@"text" : @"tag_content_text",
  30. };
  31. }
  32. 2、如果jsonmodel需要打包成xml数据(jsonmodel->json)
  33. 1)、有标签属性,且没有标签内容(大部分情况都是如此),如上面的xml报文中的PAGE标签,定义Model
  34. 安装普通model定义外,model需要定义类方法,返回对应的属性字段
  35. + (NSArray*)modelContainerAttributePropertys
  36. {
  37. return @[@"subTitle"];
  38. }
  39. 2)、有标签属性,且包含标签内容 如上面xml的TagSubARRAY,包含属性 subTitle,且有内容
  40. subArray1需要额外增加`NSArray *xml_attribute_set`,并返回对应属性的名字数组 ,可
  41. 参考下面的model定义
  42. 标签内容参数名称定义为`NSString *tag_content_text`来表示标签内容,也可以通过YYModel
  43. 提供的mapper方法自定义名称,如下面方法修改为名称text
  44. + (NSDictionary *)modelCustomPropertyMapper {
  45. return @{@"text" : @"tag_content_text",
  46. };
  47. }

如上面报文对应的model

  1. //头文件
  2. @interface PAGEModel : NSObject
  3. @property (nonatomic, copy) NSString *PAGEID;
  4. @property (nonatomic, copy) NSString *FILE_NAME;
  5. @end
  6. @interface NODEModel : NSObject
  7. @property (nonatomic, copy) NSString *SUBNODE;
  8. @property (nonatomic, strong) NSArray<PAGEModel*> *PAGE;
  9. @end
  10. //既包含属性,还有标签内容
  11. @interface TagSubARRAYModel : NSObject
  12. @property (nonatomic, copy) NSString *subTitle;
  13. @property (nonatomic, copy) NSString *text;//标签值
  14. @end
  15. @interface TagARRAYModel : NSObject
  16. @property (nonatomic, strong) NSArray<TagSubARRAYModel*> *TagSubARRAY;
  17. @end
  18. @interface ResModel : NSObject
  19. @property (nonatomic, assign) NSInteger RESPONSE_CODE;
  20. @property (nonatomic, copy) NSString *RESPONSE_MSG;
  21. //有可能是数组的,均写成数组形式
  22. @property (nonatomic, strong) NSArray<PAGEModel*> *PAGE;
  23. @property (nonatomic, strong) NSArray<NODEModel*> *NODE;
  24. @property (nonatomic, strong) NSArray<NSString*> *TITLE;
  25. @property (nonatomic, strong) NSArray<TagARRAYModel*> *TagARRAY;
  26. @end
  27. @interface RootModel : NSObject
  28. @property (nonatomic, strong) ResModel *root;
  29. @end
  1. @implementation PAGEModel
  2. //如果只是 xml->jsonmodel,该类方法可以不用实现
  3. + (NSArray*)modelContainerAttributePropertys
  4. {
  5. return @[@"PAGEID",@"FILE_NAME"];
  6. }
  7. @end
  8. @implementation NODEModel
  9. + (NSDictionary *)modelContainerPropertyGenericClass {
  10. return @{@"PAGE" : [PAGEModel class]
  11. };
  12. }
  13. @end
  14. @implementation TagSubARRAYModel
  15. //如果只是 xml->jsonmodel,该类方法可以不用实现
  16. + (NSArray*)modelContainerAttributePropertys
  17. {
  18. return @[@"subTitle"];
  19. }
  20. //标签内容 字段为tag_content_text,如果想其他名称,这里mapper
  21. + (NSDictionary *)modelCustomPropertyMapper {
  22. return @{@"text" : @"tag_content_text"};
  23. }
  24. @end
  25. @implementation TagARRAYModel
  26. + (NSDictionary *)modelContainerPropertyGenericClass {
  27. return @{@"TagSubARRAY" : [TagSubARRAYModel class]
  28. };
  29. }
  30. @end
  31. @implementation ResModel
  32. + (NSDictionary *)modelContainerPropertyGenericClass {
  33. return @{@"PAGE" : [PAGEModel class],@"NODE":[NODEModel class],@"TagARRAY":[TagARRAYModel class]
  34. };
  35. }
  36. @end
  37. @implementation RootModel
  38. + (NSDictionary *)modelContainerPropertyGenericClass {
  39. return @{@"root" : [ResModel class]
  40. };
  41. }
  42. @end