webView主要用于加載html,js之類的web頁面,而不是解析xml文件。如果不是web頁面,只是activity上的一個(gè)控件的xml布局,那么使用View.inflate(this,R.xml.***,null)就可以實(shí)現(xiàn)加載了。

創(chuàng)新互聯(lián)公司專注于漳平網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供漳平營銷型網(wǎng)站建設(shè),漳平網(wǎng)站制作、漳平網(wǎng)頁設(shè)計(jì)、漳平網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造漳平網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供漳平網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
維基上MusicXML的解釋是:(英語:Music Extensible Markup Language,音樂擴(kuò)展標(biāo)記語言)是一個(gè)開放的基于XML的記錄西式樂譜的文件格式。該格式是完全自由、開放記錄的,并依據(jù)W3C社區(qū)的許可協(xié)議自由使用。
簡單的來說,MusicXML其實(shí)就是XML,只不過承載的是樂譜信息的XML。在我們需要繪制或者創(chuàng)建六線譜之類的時(shí)候,可以通過MusicXML來記錄我們需要繪制或者創(chuàng)建的信息。目的是為音樂符號(hào)創(chuàng)造一種通用格式。(本文是基于MusicXML 3.0和2.0,所以可能會(huì)有一些出入。)因?yàn)轫?xiàng)目中用到的是吉他譜,就以吉他譜的含義來進(jìn)行說明和解釋。
MusicXML本質(zhì)也是XML,所以文件上的解析可以按XML的解析來。
XML的解析在iOS里面有兩種解析方式,一個(gè)SAX解析,一個(gè)DOM解析。
SAX解析的特點(diǎn)是逐行進(jìn)行解析。也就是一邊讀取一邊處理。對(duì)于大文件,極大的提高了解析效率。
DOM解析的特點(diǎn)是通過節(jié)點(diǎn)解析。需要一次性讀取整個(gè)XML文件并形成一個(gè)節(jié)點(diǎn)樹,通過遍歷樹結(jié)構(gòu)可以檢索任意XML節(jié)點(diǎn),讀取它的屬性和值。
比如第三方:GDataXMLNode
在這里我用的SAX解析,具體可以去看下 這里 ,是我之前用來解析MusicXML文檔寫的。
MusicXML本質(zhì)上還是XML,所以文件結(jié)構(gòu)是和XML一樣的,這個(gè)是XML文檔所需要的XML聲明。聲明用的xml版本是1.0和xml傳輸數(shù)據(jù)的時(shí)候的字符編碼。(假如文檔里有中文,編碼方式不是UTF-8,顯示上就會(huì)亂碼)
這里是說明當(dāng)前使用的MusicXML版本是什么,標(biāo)簽里面包含的內(nèi)容就是MusicXML的內(nèi)容
基本能用到的大多數(shù)就是這么多了,更多詳細(xì)的可以查看MusicXML的 官網(wǎng)文檔
繪制的話,看具體的需求了,可以嘗試在layer上異步繪制,然后在需要的情況下再渲染到view上。比如用 CAShapeLayer ,輕量,性能又好。
最受歡迎的XML分析器簡介:
iPhone最流行的XML解析器,以及每個(gè)一簡要介紹:
? NSXMLParser是一個(gè)SAX解析器SDK中包含的iPhone默認(rèn)的。 這是寫在Objective - C和使用非常簡單,但也許沒有那么容易,因?yàn)镈OM模型。
? libxml2的是一個(gè)開放源碼庫,包括iPhone SDK的默認(rèn)情況下使用。 這是一個(gè)基于C的API,所以使用起來可能不如NSXML方便。 該庫同時(shí)支持DOM和SAX處理。 該處理器的libxml2的SAX特別的酷,因?yàn)樗幸粋€(gè)能夠解析它的獨(dú)特功能正在讀取數(shù)據(jù)。 例如,你可以從網(wǎng)絡(luò)上閱讀大量的XML文檔并顯示數(shù)據(jù),您正在閱讀它給用戶,而你還在下載。
? TBXML是一個(gè)輕量級(jí)的DOM XML解析器設(shè)計(jì)得盡可能快,而資源消耗少的內(nèi)存。 它節(jié)省了驗(yàn)證時(shí)間不執(zhí)行,不支持XPath和由被只讀 - 即你可以閱讀它的XML,但是你不能再修改XML和寫回來。
? TouchXML是NSXML風(fēng)格的DOM的XML解析器的iPhone。 TBXML一樣,它也是只讀的,但它不像TBXML支持XPath。
? KissXML是另一個(gè)NSSXML風(fēng)格的DOM XML解析器的iPhone,其實(shí)TouchXML的基礎(chǔ)上。 主要區(qū)別是KissXML還支持編輯和編寫XML以及閱讀。
? TinyXML的是一個(gè)小型的C -基于DOM的XML解析器頭只包含4個(gè)C文件和兩個(gè)。 它同時(shí)支持讀取和編寫XML文件,但它不支持自己的XPath。 但是,您可以使用相關(guān)的庫 - 該TinyXPath - 。
? GDataXML是另一個(gè)NSXML風(fēng)格的DOM XML解析器的iPhone,谷歌開發(fā)作為圖書館的一部分,他們的Objective - C的客戶端。 短短的m文件和一個(gè)頭組成,它同時(shí)支持閱讀和編寫XML文檔和XPath查詢。
首先說一下,在IOS中XML解析和在Android中的SAX或者Pull解析差別不大,都是基于事件的解析方式。
首先,定義一個(gè)對(duì)象來表示XML的文檔結(jié)構(gòu)
XMLElement.h
#import Foundation/Foundation.h
@interface XMLElement : NSObject
// 標(biāo)簽名稱
@property (nonatomic,strong) NSString *name;
// 標(biāo)簽的文本(注意在上一級(jí)標(biāo)簽和下一級(jí)標(biāo)簽之間室友文本的)
@property (nonatomic,strong) NSString *text;
// 標(biāo)簽的屬性
@property (nonatomic,strong) NSDictionary *attributes;
// 子標(biāo)簽集合
@property (nonatomic,strong) NSMutableArray *subElements;
// 上一級(jí)標(biāo)簽
@property (nonatomic,strong) XMLElement *parent;
@end
XMLElement.m
#import "XMLElement.h"
@implementation XMLElement
@synthesize name,text,attributes,subElements,parent;
-(NSMutableArray *) subElements
{
if(subElements == nil){
subElements = [[NSMutableArray alloc]init];
}
return subElements;
}
@end
XML文件的內(nèi)容放在/Supporting File/的Group下面。名稱為person.xml
?xml version="1.0" encoding="UTF-8"?
root
person id="1"
firstNamezhang/firstName
lastNamesansan/lastName
age21/age
/person
person id="2"
firstNameli/firstName
lastNamesisisi/lastName
age31/age
/person
/root
解析的ViewController.h
#import UIKit/UIKit.h
#import "XMLElement.h"
@interface ViewController : UIViewController NSXMLParserDelegate
// 解析器對(duì)象
@property (nonatomic,strong) NSXMLParser *parser;
// 根元素
@property (nonatomic,strong) XMLElement *rootElement;
// 當(dāng)前的元素
@property (nonatomic,strong) XMLElement *currentElementPointer;
@end
解析的ViewController.m
#import "ViewController.h"
#import "UIColor+ColorWithARGB.h"
@interface ViewController ()
@end
@implementation ViewController
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if(self != nil){
self.title = @"XML解析";
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor r:0xA5 g:0xA5 b:0x52];
NSString *xmlFilePath = [[NSBundle mainBundle]pathForResource:@"person" ofType:@"xml"];
NSData *data = [[NSData alloc]initWithContentsOfFile:xmlFilePath];
self.parser = [[NSXMLParser alloc]initWithData:data];
self.parser.delegate = self;
if([self.parser parse]){
NSLog(@"The XML is Parsed");
NSMutableString *str = [[NSMutableString alloc]init];
[str appendFormat:@"%@\n",self.rootElement.name];
NSMutableArray *subs = self.rootElement.subElements;
for(int i = 0;i [subs count];i++){
XMLElement *personElement = [subs objectAtIndex:i];
[str appendFormat:@"\tname:%@",personElement.name];
[str appendFormat:@",text:%@\n",personElement.text];
NSArray *subPersonElements = personElement.subElements;
for(int j = 0;j [subPersonElements count];j++){
XMLElement *subElement = [subPersonElements objectAtIndex:j];
[str appendFormat:@"\t\tname:%@",subElement.name];
[str appendFormat:@",text:%@\n",subElement.text];
}
}
NSLog(@"======解析結(jié)果:%@" ,str);
}else{
NSLog(@"Failed to parse the XML");
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// 文檔開始
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
self.rootElement = nil;
self.currentElementPointer = nil;
}
// 文檔結(jié)束
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
self.currentElementPointer = nil;
}
// 元素開始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if(self.rootElement == nil){
self.rootElement = [[XMLElement alloc]init];
self.currentElementPointer = self.rootElement;
}else{
XMLElement *newElement = [[XMLElement alloc]init];
newElement.parent = self.currentElementPointer;
[self.currentElementPointer.subElements addObject:newElement];
self.currentElementPointer = newElement;
}
self.currentElementPointer.name = elementName;
self.currentElementPointer.attributes = attributeDict;
NSLog(@"name:%@" , elementName);
}
// 元素結(jié)束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
self.currentElementPointer = self.currentElementPointer.parent;
NSLog(@"end name:%@" , elementName);
}
// 解析文本,會(huì)多次解析,每次只解析1000個(gè)字符,如果多月1000個(gè)就會(huì)多次進(jìn)入這個(gè)方法
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if([self.currentElementPointer.text length] 0){
self.currentElementPointer.text = [self.currentElementPointer.text stringByAppendingString:string];
}else{
self.currentElementPointer.text = [NSMutableString stringWithString:string];
}
NSLog(@"string:%@" , string);
}
@end
NSString *soapStr = [NSString stringWithFormat:@"?xml version=\"1.0\" encoding=\"utf-8\"?\
soap:Envelope xmlns:xsi = \"htttp://www.網(wǎng)址.com"\
xmlns:soap = \"http://網(wǎng)址\"\
soap:header\
/soap:header\
soap:Body\
// 這中間基本就是要寫的參數(shù),在Body 之間就是參數(shù)
/soap:Body\
/soap:Envelope"];?
NSURL *url=[NSURL URLWithString:@"你自己wsdl文檔中對(duì)應(yīng)的endpoint address"];
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
// 訪問方式[request setHTTPMethod:@"POST"];
// 設(shè)置請(qǐng)求頭(請(qǐng)求頭也可以不設(shè)置,前兩個(gè)設(shè)不設(shè)置都一樣,應(yīng)該默認(rèn)的,但是SOAPAction我怎么都設(shè)置不對(duì),不設(shè)置也可以,干脆不設(shè)置了)
// [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];//? [request addValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];
//? ? [request addValue:@"nameSpace/methodName" forHTTPHeaderField:@"SOAPAction"];
// body內(nèi)容 [request setHTTPBody:[soapStr dataUsingEncoding:NSUTF8StringEncoding]];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString *result = [[NSString alloc] initWithData:data? encoding:NSUTF8StringEncoding];
NSLog(@"進(jìn)入成功回調(diào)Session-----結(jié)果:%@----請(qǐng)求地址:%@", result, response.URL);
if (error) {
NSLog(@"Session----失敗----%@", error.localizedDescription);
}
}];
[task resume];
// 傳入一個(gè)字典只有唯一(key - value)的數(shù)組,
// eg: NSArray *array = @[@{@"addr":@"777"},@{@"999":@"666"},@{@"000":@"111"}];
+ (NSString*)convertDicArrayToXML:(NSArray*)arrayandElement:(NSString*)element {
if (array.count=0) {
return nil ;
}
NSMutableString *mString = [NSMutableString string];
[mStringappendFormat:@"%@ xmlns=\"\"",element];
for (NSDictionary*dic in array) {
? ? [mStringappendFormat:@"%@", dic.allKeys.firstObject];
? ? [mStringappendFormat:@"%@", dic.allValues.firstObject];
? ? [mStringappendFormat:@"/%@\t\t", dic.allKeys.firstObject];
}
[mStringappendFormat:@"/%@", element];
return mString;
}
+ ( void )xmlRequestPOSTWithSoapBody:(NSString*)bodyStringandElement:(NSString*)elementsuccess:( void (^)( id responseObject))successfailure:( void (^)(NSError*error))failure {
//? ? DLog(@"....bodyString = %@", bodyString);
NSString*soapStr = [NSString stringWithFormat:
? ? ? ? ? ? ? ? ? ? @"?xml version=\"1.0\" encoding=\"utf-8\"?\
? ? ? ? ? ? ? ? ? ? soap:Envelope xmlns:xsi=\"\" xmlns:xsd=\"\"\
xmlns:soap=\"\"\
soap:Body%@/soap:Body\
/soap:Envelope",bodyString];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
// 設(shè)置請(qǐng)求超時(shí)時(shí)間
manager.requestSerializer.timeoutInterval = 15;
// 返回NSData
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 設(shè)置請(qǐng)求頭,也可以不設(shè)置
[manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];
[manager.requestSerializer setValue:[NSString stringWithFormat:@"",element] forHTTPHeaderField:@"SOAPAction"];
// 設(shè)置HTTPBody
[manager.requestSerializersetQueryStringSerializationWithBlock:^NSString*(NSURLRequest*request,NSDictionary*parameters,NSError* __autoreleasing *error) {
? ? return soapStr;
}];
[managerPOST:webService_Urlparameters:soapStrprogress:^(NSProgress* _Nonnull uploadProgress) {
}success:^(NSURLSessionDataTask* _Nonnull task, id ? _Nullable responseObject) {
? ? //DLog(@"responseObject = %@", responseObject);
? ? // 把返回的二進(jìn)制數(shù)據(jù)轉(zhuǎn)為字符串
? ? NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
? // DLog(@"result = %@", result);
? ? // 利用正則表達(dá)式取出之間的字符串
? ? NSString*resultString = [NSStringstringWithFormat:@"(?=%@Result\\).*(?=/%@Result)",element,element];//@"(?=return\\).*(?=/return)"
? ? NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:resultString? options:NSRegularExpressionCaseInsensitive error: nil ];
? ? NSDictionary *dict = [NSDictionary dictionary]; ? ?? for (NSTextCheckingResult*checkingResult in [regularmatchesInString:resultoptions:0range:NSMakeRange(0, result.length)]) {
? ? ? ? // 得到字典
? ? ? ? dict = [NSJSONSerialization JSONObjectWithData:[[result substringWithRange:checkingResult.range] dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error: nil ];
? ? }
? ? if (success) {
? ? ? ? success(dict);
? ? }
? // DLog(@"dic = %@", dict);
}failure:^(NSURLSessionDataTask* _Nullable task,NSError* _Nonnull error) {
? ? DLog(@"error = %@", error);
? ? if (failure) {
? ? ? ? failure(error);
? ? }
}];
}
調(diào)用一下:
+ ( void )mallListWithType:(NSString * _Nullable )type
? ? ? ? ? ? success:( void (^ _Nullable )( id _Nullable responseObject))success
? ? ? ? ? ? failure:( void (^ _Nullable )(NSString* _Nullable strError))failure {
NSString *element = @"ZHWS_GetActivityMallAdList";
NSArray*bodyArray =@[
? ? @{@"Type":type}
];
NSString*bodyString = [ self convertDicArrayToXML:bodyArrayandElement:element];
[ self xmlRequestPOSTWithSoapBody:bodyStringandElement:elementsuccess:^( id responseObject) {
? ? DLog(@"... 活動(dòng)相關(guān)、商場廣告、廣告列表 = %@", responseObject);
? ? if (responseObject) {
? ? ? ? success(responseObject);
? ? }
}failure:^(NSError*error) {
? ? if (error) {
? ? ? ? //failure(error.mj_JSONString);
? ? }
}];
}
近期項(xiàng)目剛好用到這個(gè),之前也沒有用過,所以順手就記錄一下。如有錯(cuò)誤,看到的小伙伴請(qǐng)指正。
參考鏈接:
解析xml, 在ios中可以使用NSXMLParser 類來解析。當(dāng)然也有一些第三方庫可以方便操作,如:GDataXml
網(wǎng)站題目:ios開發(fā)xml解析,ios xml布局
網(wǎng)址分享:http://chinadenli.net/article26/dsgcscg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、、App設(shè)計(jì)、網(wǎng)站設(shè)計(jì)公司、做網(wǎng)站、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)