了解的NSXMLParser iOS中(Learn about the NSXMLParser in

2019-07-19 01:03发布

我了解当前的NSXMLParser。 我看了很多教程,但没有人能告诉我它到底是如何工作的。 有StackOverflow上的教程? 我的问题是这样的KML读structur在我的应用程序,并显示的MKMapView

我的分析器类是这样的:

#import <Foundation/Foundation.h>

@interface Parser : NSXMLParser

@property (nonatomic, strong) NSString *rowElementName; // this is the element name that identifies a new row of data in the XML
@property (nonatomic, strong) NSArray *attributeNames;  // this is the array of attributes we might want to retrieve for that element name
@property (nonatomic, strong) NSArray *elementNames;    // this is the list of sub element names for which we're retrieving values

@property (nonatomic, strong) NSMutableArray *items;    // after parsing, this is the array of parsed items

@end

#import "Parser.h"

@interface Parser () <NSXMLParserDelegate>

@property (nonatomic, strong) NSMutableDictionary *item;     // while parsing, this is the item currently being parsed
@property (nonatomic, strong) NSMutableString *elementValue; // this is the element within that item being parsed

@end

@implementation Parser

- (id)initWithContentsOfURL:(NSURL *)url
{
    self = [super initWithContentsOfURL:url];

    if (self)
    {
        self.delegate = self;
    }

    return self;
}

- (id)initWithData:(NSData *)data
{
    self = [super initWithData:data];

    if (self)
    {
        self.delegate = self;
    }

    return self;
}

- (id)initWithStream:(NSInputStream *)stream
{
    self = [super initWithStream:stream];

    if (self)
    {
        self.delegate = self;
    }

    return self;
}

#pragma mark - NSXMLParserDelegate methods

- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    self.items = [[NSMutableArray alloc] init];

    if (!self.rowElementName)
        NSLog(@"%s Warning: Failed to specify row identifier element name", __FUNCTION__);
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:self.rowElementName])
    {
        self.item  = [[NSMutableDictionary alloc] init];

        for (NSString *attributeName in self.attributeNames)
        {
            id attributeValue = [attributeDict valueForKey:attributeName];
            if (attributeValue)
                [self.item setObject:attributeValue forKey:attributeName];
        }
    }
    else if ([self.elementNames containsObject:elementName])
    {
        self.elementValue = [[NSMutableString alloc] init];
    }
}

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

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementName isEqualToString:self.rowElementName])
    {
        [self.items addObject:self.item];
        self.item = nil;
    }
    else if ([self.elementNames containsObject:elementName])
    {
        [self.item setValue:self.elementValue forKey:elementName];
        self.elementValue = nil;
    }
}

@end

通过创建抢

我的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
    <name>Filename.kml</name>
    <Style id="style1">
        <IconStyle>
            <Icon>
                <href>http://imageshack.us/a/img825/9079/pinvi.png</href>
            </Icon>
        </IconStyle>
    </Style>
    <Placemark>
        <name><![CDATA[Blankenese]]></name>
        <Snippet><![CDATA[Blankeneser Bahnhofstr. 9 22587 Hamburg +49-(0)40-866 06 50 +49-(0)40-86 60 65 60]]></Snippet>
        <description><![CDATA[<img src="http://www.engelvoelkers.com/shops/de-blankenese-res.jpg"><br/>Blankeneser Bahnhofstr. 9<br/>22587 Hamburg<br/>Telefon: +49-(0)40-866 06 50<br/>Fax: +49-(0)40-86 60 65 60<br/><a href="http://www.engelvoelkers.com/elbe">Website</a><br/>E-Mail: Blankenese@engelvoelkers.com]]></description>
        <styleUrl>#style1</styleUrl>
        <Point>
            <coordinates>9.811470,53.559441</coordinates>
        </Point>
    </Placemark>
</Document>
</kml>

我的目标是让所有的信息在<description>标记并显示它喜欢它谷歌,地图做

不完全是,但类似。

但首先我需要知道我怎么能与分析器工作

最好的问候CTS

Answer 1:

有两个根本不同的组件对这个问题,分析和标注的地图。 我将重点在地图上标注在这里,因为我觉得我所覆盖的解析问题在这里: 尝试加载的MKMapView创建的地图 。 在这个答案的最后,虽然,我包括苹果的解析文档一些参考,如果你只是试图让你双臂环绕NSXMLParser

地图标注

在映射应用程序的通用模型在iPhone上是不显示内容丰富一酥料饼在地图上查看本身,而是由于iPhone的有限的房地产,只显示标准标注,但设置rightCalloutAccessoryView是一个公开指标,其中,如果在敲打,将Segue公司与细节,下一个视图。 因此,通过使用UIMapViewDelegate方法,你可以有一个mapView:viewForAnnotation:上面写着:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
    annotationView.canShowCallout = YES;
    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    return annotationView;
}

这产生如下的用户界面:

然后,您可以有一个mapView:annotationView:calloutAccessoryControlTapped:像这样:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    [self performSegueWithIdentifier:@"DetailsIphone" sender:view];
}

你可以用它来进入你的细节画面。 (我只是在做一个模式SEGUE与Web视图视图控制器,通过注释的prepareForSegueviewDidLoad被抓住了html等细节,在这里是不值一提。我认为你可以直接过渡到自己的详细资料屏幕设计的东西比这个快速和肮脏的Web视图......我只是证明我们可以抓住的HTML为某个地标出来的KML文件)的漂亮:

所以,虽然iPhone真的不应该使用地图本身,在iPad上popovers,你可以使用它们。 您可以创建rightCalloutAccessoryView以类似的方式(尽管可能使用“信息”按钮,而不是详细披露):

但在这里,你可以拥有mapView:annotationView:calloutAccessoryControlTapped:实际上产生酥料饼的,而不是做一个模式转换:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    //CGRect frame = view.frame;
    [mapView deselectAnnotation:view.annotation animated:YES];

    DetailsViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailsPopover"];
    controller.annotation = view.annotation;
    self.popover = [[UIPopoverController alloc] initWithContentViewController:controller];
    self.popover.delegate = self;
    [self.popover presentPopoverFromRect:view.frame
                                  inView:view.superview
                permittedArrowDirections:UIPopoverArrowDirectionAny
                                animated:YES];
}

其中收益率:

顺便说一句,这大致接近iPad的地图应用是如何做的(当你点击一个引脚上,就说明你有一个“信息”按钮标注),而如果你再点击信息按钮,就说明你的酥料饼与细节。

或者,你可以有引脚上的点击带你到你的酥料饼,绕过中间的标注。 要做到这一点,首先,虽然,必须禁用注解视图标注,本身:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
    annotationView.canShowCallout = NO;

    return annotationView;
}

但是,你就必须作出回应mapView:didSelectAnnotationView:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    [mapView deselectAnnotation:view.annotation animated:YES];

    DetailsViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailsPopover"];
    controller.annotation = view.annotation;
    self.popover = [[UIPopoverController alloc] initWithContentViewController:controller];
    self.popover.delegate = self;
    [self.popover presentPopoverFromRect:view.frame
                                  inView:view.superview
                permittedArrowDirections:UIPopoverArrowDirectionAny
                                animated:YES];
}

从理论上说,你可以做这样的事情在iPhone上,但因为你不能使用UIPopoverController ,你不得不使用一些第三方酥料饼(或写你自己的)。 我听说有些人声称,苹果已经拒绝了iPhone应用程序使用酥料饼的意见,但我既不能确认,也不能说这是否是一个硬性规定。 我只知道,在苹果和谷歌iPhone应用程序映射没有在iPhone上的地图应用程序使用大酥料饼的意见(苹果塞格斯另一种观点认为,谷歌已经就出现在屏幕的底部)。 如果你想想看,如果引脚是在市中心,你想生成大酥料饼指向该引脚,它可能会变得拥挤。

不管怎样,这些都是对于使用选项rightCalloutAccessoryView设置和/或禁用canShowCallout并直接表示酥料饼。


解析引用:

  • 苹果事件驱动的XML编程指南
  • 的NSXMLParser类参考

地图视图标注参考:

  • 定制MKAnnotation标注气泡


Answer 2:

解析器是这样的,根标签打开,再分标签进行搜索。 当没有更多的嵌套标签读取数据,在这里你可以对你要如何保存数据的选项。 还有许多其他可用的解析器。 通过gDataXMLParser去。 我已经使用它,工作得很好,并确保递归调用解析器,如果有嵌套的标签。 如果你正在寻找一个特定的标签使用字符串,找到子串即,从<b></b>这样的事情和阅读中的文本。



文章来源: Learn about the NSXMLParser in iOS