NSXMLParserErrorDomain ошибка 31 - PullRequest
       3

NSXMLParserErrorDomain ошибка 31

0 голосов
/ 01 марта 2011

Я получаю эту ошибку при получении XML-запроса от http://www.cbr.ru/scripts/XML_daily.asp

XML-код, подобный следующему:

<?xml version="1.0" encoding="windows-1251" ?>
<ValCurs Date="01.03.2011" name="Foreign Currency Market">
<Valute ID="R01010">
    <NumCode>036</NumCode>
    <CharCode>AUD</CharCode>
    <Nominal>1</Nominal>
    <Name>Австралийский доллар</Name>
    <Value>29,3508</Value>
</Valute>
<Valute ID="R01020A">
    <NumCode>944</NumCode>
    <CharCode>AZN</CharCode>
    <Nominal>1</Nominal>
    <Name>Азербайджанский манат</Name>
    <Value>36,3374</Value>
</Valute>

Мой код:

-(void)parserDidStartDocument:(NSXMLParser *)parser
{

 [articles removeAllObjects];
} 

-(void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
{
    currentElement = elementName;
    if ([elementName isEqualToString:@"ValCurs"]) {
        itemActive = YES;
        currentValute = [[NSMutableString alloc]init];
        currentNumCode = [[NSMutableString alloc]init];
        currentCharCode = [[NSMutableString alloc]init];
        nominal = [[NSMutableString alloc]init];
        currentName = [[NSMutableString alloc]init];
        currentValue = [[NSMutableString alloc]init];
    }
    }

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if (itemActive) {
        NSString *fixedString = [string     stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        if ([currentElement isEqualToString:@"Valute"]) 
            [currentValute appendString:fixedString];
        if ([currentElement isEqualToString:@"NumCode"]) 
            [currentNumCode appendString:fixedString];
        if ([currentElement isEqualToString:@"CharCode"]) 
            [currentCharCode appendString:fixedString];
        if ([currentElement isEqualToString:@"Nominal"]) 
            [nominal appendString:fixedString];
        if ([currentElement isEqualToString:@"Name"])
            [currentName appendString:fixedString];
        if ([currentElement isEqualToString:@"Value"])
            [currentValue appendString:fixedString];


}       
}

-(void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
    if ([elementName isEqualToString:@"ValCurs"]) {
        NSDictionary *record = [NSDictionary dictionaryWithObjectsAndKeys:
                                currentValute,@"Valute",
                                currentNumCode,@"NumCode",
                                currentCharCode,@"CharCode",
                                nominal,@"nominal",
                                currentName,@"Name",
                                currentValue,@"Value",
                                nil];
        [articles addObject:record];
        [currentNumCode release];
        [currentCharCode release];
        [currentValute release];
        [nominal release];
        [currentName release];
        [currentValue release];
        itemActive = NO;
    }
    }

-(void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"%@",articles);
//text.text = (@"%@",currentCharCode);
}

-(void)retrieveXML:(id)sender
{
    [parser parse];
}

........

- (void)viewDidLoad {
    [super viewDidLoad];
    articles = [[NSMutableArray alloc]init];
    NSString *myURL = [NSString     stringWithFormat:@"http://www.cbr.ru/scripts/XML_daily.asp"];

    NSURL *url = [NSURL URLWithString:myURL];
    //NSString *urla = [NSString stringWithContentsOfURL:url     encoding:NSUTF8StringEncoding error:nil];
    parser = [[NSXMLParser alloc]initWithContentsOfURL:url];
    parser.delegate = self;
    [self createUI];
} 

Из ссылки NSXMLParser -NSXMLParserUnknownEncodingError = 31. Может быть мне нужно использовать кодирование для NSWindowsCP1251StringEncoding для решения проблемы?

1 Ответ

1 голос
/ 01 марта 2011

NSXMLParserUnknownEncodingError = 31 происходит, когда кодировка документа неизвестна.

Попробуйте это:

NSString *myStr = [[NSString alloc] initWithData:myData encoding:NSWindowsCP1251StringEncoding];
myStr = [myStr stringByReplacingOccurrencesOfString:@"encoding=\"windows-1251\"" withString:@""];


NSData* aData = [myStr dataUsingEncoding:NSUTF8StringEncoding];


NSXMLParser *parser = [[NSXMLParser alloc] initWithData:aData];
...