使用&amp ;;从XML解析URL在里面

时间:2009-02-08 02:09:20

标签: xml cocoa-touch

我正在尝试解析网址中包含&的网址:

ViewArticle.dbml?DB_OEM_ID=1800&ATCLID=3664162

..但是使用NSXMLParser,我得到的只是1800ATCL。它完全忽略了&

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if (qName) {
        elementName = qName;
    }


    if ([elementName isEqualToString:@"title"]) {
        self.contentOfCurrentNewsProperty = [NSMutableString string];
    }else if ([elementName isEqualToString:@"link"]){
        self.contentOfCurrentNewsProperty = [NSMutableString string];
    }else {
        self.contentOfCurrentNewsProperty = nil;
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{     
    if (qName) {
        elementName = qName;
    }

    _currentElement = elementName;

    if ([elementName isEqualToString:@"title"]) {
        self.currentNewsObject.title = self.contentOfCurrentNewsProperty;
    } else if ([elementName isEqualToString:@"link"]){
        self.currentNewsObject.link = self.contentOfCurrentNewsProperty;
    }
}

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

有什么想法吗?感谢

修改:我做了更多测试,并且<?xml version="1.0" encoding="windows-1252"?>行 是什么搞砸了,但这是嵌入在xml文件中,以任何方式解决它?**

3 个答案:

答案 0 :(得分:2)

感谢你们的帮助,我能够使用

    NSData *myData = [NSData dataWithContentsOfURL:URL];
    NSString *myStr = [[NSString alloc] initWithData:myData encoding:NSWindowsCP1252StringEncoding];
    myStr = [myStr stringByReplacingOccurrencesOfString:@"encoding=\"windows-1252\"" withString:@""];
NSLog(@"my str is %@", myStr);

NSData* aData = [myStr dataUsingEncoding:NSUTF8StringEncoding];

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

现在一切正常,再次感谢。

答案 1 :(得分:1)

(dbr:原始海报使用的是NSXMLParser,而非NSXMLDocument,因此没有setCharacterEncoding方法可供他覆盖。)

OP:为了测试你的情况,我写了一个简单的命令行实用程序,它使用NSXMLParser来解析带有<?xml version="1.0" encoding="windows-1252"?>处理指令的XML文档。解析总是失败,错误代码是31,对应于枚举NSXMLParserUnknownEncodingError

要解决此问题,您可能需要预处理输入数据。这样做的一种方法可能是使用[NSString stringWithCString:yourCstring encoding:NSWindowsCP1252StringEncoding],其中yourCstring是包含XML的标准C char*。然后,您可以删除<?xml version="1.0" encoding="windows-1252"?>处理指令,将NSString转换为NSData,并将其传递给NSXMLParser。

答案 2 :(得分:0)

也许您可以使用setCharacterEncoding

覆盖编码
  

的setCharacterEncoding:

     

将接收器的字符编码设置为encoding,

     

- (void)setCharacterEncoding:(NSString *)encoding

     

参数:

     
      
  • 编码

         

    指定编码的字符串;它必须与IANA字符集的名称匹配。有关有效编码说明符的列表,请参阅http://www.iana.org/assignments/character-sets

         

    通常,编码在处理的文档的XML声明中指定,但可以随时设置。如果指定的编码与实际编码不匹配,则解析文档可能会失败。

  •