2013-05-27 1 views
0

이 내 countries.xml 파일을 구문 분석하는 동안.오류 "오류 구문 분석 문서!"내 XML

는 PLS

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict/> 
<countris> 
<country> 
    <countryname>india<countryname>  
</country> 
</countris> 
</plist> 

viewDidLoad입니다 ..... 내가 아이폰 OS에 새로운 오전 내 질문에 대답을 문제 것입니다 : 내가 implemantig

NSString *filename = [[NSBundle mainBundle] pathForResource:@"countris" ofType:@"xml"]; 
NSData *data = [NSData dataWithContentsOfFile:filename]; 


NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 

Myparser *myParser = [[Myparser alloc] init]; 

[parser setDelegate:myParser]; 

BOOL success = [parser parse]; 

if (success) 
{ 
    NSMutableArray *users = [myParser arraydata]; 
    NSString *log= [NSString stringWithFormat: 
          @"This is an array of User objects:\n\n%@", 
          [users description]]; 
    NSLog(log); 
} 
else 
{ 
    NSLog(@"Error parsing document!"); 

    [[[UIAlertView alloc] initWithTitle:nil 
           message:@"Error parsing document!" 
           delegate:nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil] show]; 
} 

내 Myparser.m 파일 내 NSXMLParserDelegate 프로토콜은

#import "Myparser.h" 
#import "MyParserData.h" 

@implementation Myparser 

@synthesize mydata,myparser,arraydata,flag,currentElementValue; 

- (id) init { 

    if(self = [super init]) { 
     currentElementValue = [[NSMutableString alloc] initWithString:@""]; 
     arraydata = [[NSMutableArray alloc] init]; 
     flag = FALSE; 
    } 
    return self; 
} 

- (void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict { 

    if ([elementName isEqualToString:@"countris"]) { 
     return; 
    } else if ([elementName isEqualToString:@"country"]) { 
     self.mydata = [[MyParserData alloc] init]; 
     } else { 
     self.currentElementValue = [[NSMutableString alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (self.currentElementValue) { 
     [self.currentElementValue appendString:string]; 
    } 
} 

- (void)parser:(NSXMLParser *)parserdidEndElement:(NSString *)elementNamenamespaceURI:   (NSString *)namespaceURIqualifiedName:(NSString *)qName { 

    if ([elementName isEqualToString:@"counteis"]) { 

     return; 
    } 

    if ([elementName isEqualToString:@"country"]) { 
     [self.arraydata addObject:mydata]; 
     self.mydata = nil; 
    } else { 
     [self.mydata setValue:self.currentElementValue forKey:elementName]; 
    } 

    self.currentElementValue = nil; 
} 

@end 
+0

무엇이 문제입니까? U 형 문제를 지정하지 않았다면 어떻게 해결할 수 있습니까? – manujmv

+0

@ manujmv 문제는 질문 제목에 있다고 생각합니다 –

+0

도움을 주셔서 감사합니다. 문제가 생겼습니다 ... –

답변

1

귀하의 XML을 할 수 없다 유효하지 않습니다 파서의 기억을 기록합니다. 당신은 <countryname> 태그가 있지만 (즉, 당신이 </countryname>에서 /을 놓치고)을 닫습니다하지 않습니다.

NSXMLParser를 사용하여, 나는 parseErrorOccurred 구현을 제안하고 오류 객체를보고 당신의 XML 소스의 문제를 찾을 수있는 위치에 당신에게 통찰력을 자주 줄 것이다 것입니다. Cocoa 프레임 워크는 일반적으로 오류에 대한 정보를 얻을 수있는 방법을 제공하므로 이러한 기술을 유용하게 사용할 수 있습니다. 그런데


, 나는 당신이 plist 형식을 사용하려고 시도하는 것으로 나타 것을 알 수 있지만, 손으로 XML을 작성하는 것처럼 아주 적절한 형식과 일치하지 않습니다. 일반적으로 plist 개의 파일을 사용하는 경우 NSXMLParser을 전혀 사용할 필요가 없으며 XML 소스를 수동으로 만들지 않아도됩니다.

다음과 같은 소스 코드를 상상해 : 당신은 writeToFile를 사용하여 PLIST를 작성하면

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>countries</key> 
    <dict> 
     <key>country</key> 
     <string>india</string> 
    </dict> 
</dict> 
</plist> 

건은, 지금 읽을 수있다 :

NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
NSString *filename = [docsPath stringByAppendingPathComponent:@"test.plist"]; 

NSDictionary *dictionary = @{@"countries": @{@"country" : @"india"}}; 
[dictionary writeToFile:filename atomically:YES]; 

이것은처럼 보이는 test.plist 파일을 만듭니다 로 : 분명히

dictionary = [NSDictionary dictionaryWithContentsOfFile:filename]; 
NSLog(@"dictionary = %@", dictionary); 

, 당신은 U하는 방법을 배울려고하는 경우 se NSXMLParser, 실험을 계속하십시오. plist 파일을 사용하는 경우, 당신은 단지로드 dictionaryWithContentsOfFile을 저장 writeToFile을 사용하고하여 프로세스를 단순화 할 수 있습니다. 그런데

,이 과정도뿐만 아니라 NSDictionary 객체하지만 NSArray 객체와 함께 작동합니다. 예를 들어 사전의 배열을 고려 :

// create array plist 

filename = [docsPath stringByAppendingPathComponent:@"array.plist"]; 
NSArray *array = @[@{@"country" : @"india"}, @{@"country" : @"france"}]; 
[array writeToFile:filename atomically:YES]; 

// read array plist 

array = [NSArray arrayWithContentsOfFile:filename]; 

을하지만 아이디어는 당신이 이제까지 XML 소스를 직접 만지지 않으며, NSXMLParser 처리하지 않고, XML 형식으로 사전 및 배열을 저장할 수 있다는 것입니다.

자세한 내용은 Property List Programming Guide을 참조하십시오.


그리고 당신의 배열 및 사전 정의 객체를 포함하는 경우, 즉 표준 코코아가 아닌 다른 객체 NS 객체 (예 : NSString, NSNumber, NSDate, 등),이 NSKeyedArchiver라는 또 다른 기술하고 있습니다 NSKeyedUnarchiver 바이너리 plist 파일을 XML 형식을 사용하여 다시 작성하지만 XML 소스 직접 작성에 대한 세부 정보는 다시 쓰지 않고 NSXMLParser을 다루지 않습니다. 좀 더 복잡하고 사용자 정의 클래스를 사용하는 배열/사전을 다루지 않는 한 걱정하지 않아도됩니다.하지만 XML 자체를 다룰 필요없이 XML 파일을 처리 할 수있는 또 다른 멋진 추상화입니다.

+0

이 덕분에 많은 도움이되었습니다. –

1

당신의 countries.xml 파일에, 당신은 닫지 countryn 않는 것 같다 하지만 나라의 실제 이름 뒤에 다시 열어 라.

+0

thabks하지만 내 로그 출력은 ""이라고 말합니다. –

2
WRONG <countryname>india<countryname>  
RIGHT <countryname>india</countryname>  

이 파서에 에러가 발생하고 따라서 그 오류 위임 방법 안타.

출력은 결과

+0

어떻게 데이터를 얻을 수 있습니까 ?? –