解析时无法从XML中获取适当的元素

时间:2013-12-09 19:30:16

标签: objective-c xml nsxmlparser

我的XML页面如下所示:

<announcement>
  <body>

...然后有许多标签跟着

<files>
  <images originalSize="101554" id="4641530">
    <description>Ласковый покалеченный приютский пёс Федя в дар.</description>
    <image id="21126492" url="http://dmir.ru/images/laskovyy-pokalechennyy-priyutskiy-pes-fedya-v-dar-21126492.jpg" name="first" width="56" height="56"/>
    <image id="21126493" url="http://dmir.ru/images/laskovyy-pokalechennyy-priyutskiy-pes-fedya-v-dar-21126493.jpg" name="prev" width="103" height="77"/>
    <image id="21126494" url="http://dmir.ru/images/laskovyy-pokalechennyy-priyutskiy-pes-fedya-v-dar-21126494.jpg" name="prev_card" width="158" height="124"/>
    <image id="21126495" url="http://dmir.ru/images/laskovyy-pokalechennyy-priyutskiy-pes-fedya-v-dar-21126495.jpg" name="middle" width="462" height="348"/>
    <image id="21126496" url="http://dmir.ru/images/laskovyy-pokalechennyy-priyutskiy-pes-fedya-v-dar-21126496.jpg" name="default" width="640" height="482"/>
  </images>
  <images originalSize="146409" id="4641531">
    <description>Ласковый покалеченный приютский пёс Федя в дар.</description>
    <image id="21126497" url="http://dmir.ru/images/laskovyy-pokalechennyy-priyutskiy-pes-fedya-v-dar-21126497.jpg" name="first" width="56" height="56"/>
    <image id="21126498" url="http://dmir.ru/images/laskovyy-pokalechennyy-priyutskiy-pes-fedya-v-dar-21126498.jpg" name="prev" width="103" height="77"/>
    <image id="21126499" url="http://dmir.ru/images/laskovyy-pokalechennyy-priyutskiy-pes-fedya-v-dar-21126499.jpg" name="prev_card" width="158" height="124"/>
    <image id="21126500" url="http://dmir.ru/images/laskovyy-pokalechennyy-priyutskiy-pes-fedya-v-dar-21126500.jpg" name="middle" width="284" height="348"/>
    <image id="21126501" url="http://dmir.ru/images/laskovyy-pokalechennyy-priyutskiy-pes-fedya-v-dar-21126501.jpg" name="default" width="554" height="680"/>
  </images>

...其他3个带图片的标签,然后关闭标签<body>

大约有40个类似的XML元素,包括图像,文本标签和其余部分,我不想把它全部放在这里,因为它非常大。

我的观点是,我可以轻松地解析每个元素:

如果([elementName isEqualToString:@"text"]),则将其保存到数组中,但是,有很多图像标记。当我可以轻松找到相应的文字或描述标签时,我找不到合适的图像,因为它们有很多。我想得到一个具有适当宽度/高度的图像(一个来自30),然后保存并进一步移动,但现在我做的最好的是有这样的未排序图像链接数组:

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

        self.imageString = [attributeDict objectForKey:@"url"];
        if (self.imageString) {
//        NSLog(@"%@", self.imageString);
        }

       [self.listOfImages addObject:self.imageString];

哦,我真的希望你和我在一起,现在你明白了我的意思和想做的事情。如何获得与正确密钥相对应的正确图像字符串(一个来自多个)(当我尝试使用密钥时,我发现解决方案不起作用,因为每个元素包含5个密钥,例如我想要单个元素与密钥“url”,其中还有关键的“prev”,并且只想要一个具有该参数的对象。)

任何帮助或建议将不胜感激。谢谢!

编辑:我试图比较这样的两个字符串,也许这有助于找出正确的字符串:

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

        descriptionNew = [self.currentPosition objectForKey:@"description"];

        }


    if (descriptionOld == descriptionNew){
        NSLog(@"equal");
    }   else {
        newElement = YES;
        NSLog(@"not equal");
    }

然后BOOL newElement可用于从数组中删除最后一个对象..但我认为这种方法不是很好,解决方案应该更简单

1 个答案:

答案 0 :(得分:1)

你说:

  

当我尝试使用键时,我发现该解决方案无法正常工作,因为每个元素包含5个键,例如我想要一个带有键“url”的单个元素,它还具有键“prev”,并且还只需要一个对象那个参数

你可以通过以下方式实现这一目标:

if ([elementName isEqualToString:@"image"])
{
    NSString *name = attributDict[@"name"];

    if ([name isEqualToString:@"prev"] && self.imageURLString == nil) 
    {   
        NSString *urlString = attributeDict[@"url"];
        if (urlString)
        {
            self.imageURLString = urlString;
        }
    }
}

但是,在其他地方,你说:

  

当我可以轻松找到相应的文字或描述标签时,我找不到合适的图像,因为它们有很多。我想获得一个具有适当宽度/高度的图像(一个来自30),然后保存并进一步移动......

您必须描述要应用的规则以确定“正确的宽度/高度”。您可能只想让解析器保存image整个attributeDict中的每一个:

if ([elementName isEqualToString:@"image"])
{
    [self.listOfImages addObject:attributeDict];
}

然后,当您完成所有images的解析后,您可以遍历所有这些并确定哪个是“最佳”,并在需要时将其余部分删除。您也可以在解析时执行此操作(例如,保存“迄今为止最佳图像”的attributeDict,并且每次解析新图像时,查看尺寸是否更好,如果是,请更换与当前的“最好的形象”)。

但是如果不知道你想要应用的确切规则,那就很难具体了。