Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS编程中从web加载的xml中删除重复项_Ios_Objective C_Xml_Xcode_Deduplication - Fatal编程技术网

如何在iOS编程中从web加载的xml中删除重复项

如何在iOS编程中从web加载的xml中删除重复项,ios,objective-c,xml,xcode,deduplication,Ios,Objective C,Xml,Xcode,Deduplication,比如说,如果我从web上的xml文件中解析了以下配置文件,并希望删除重复的配置文件,我将如何做到这一点?例如,有两个同名(Amin)的配置文件,我只想显示1个。我正在使用NSLog在命令输出窗口中显示从xml文件解析的所有配置文件,并说我是否希望有一个按钮来过滤配置文件并删除重复项,并使用删除的重复项更新命令输出窗口(使用NSLog) <profiles> <profile> <firstname>Amin</firstname>

比如说,如果我从web上的xml文件中解析了以下配置文件,并希望删除重复的配置文件,我将如何做到这一点?例如,有两个同名(Amin)的配置文件,我只想显示1个。我正在使用NSLog在命令输出窗口中显示从xml文件解析的所有配置文件,并说我是否希望有一个按钮来过滤配置文件并删除重复项,并使用删除的重复项更新命令输出窗口(使用NSLog)

<profiles>
  <profile>
    <firstname>Amin</firstname>
    <lastname>Ziarkash</lastname>
    <address>Melisstokelaan 2068</address>
    <zipcode>2541 GH</zipcode>
    <city>Den Haag</city>
    <email>a.ziarkash@hotmail.com</email>
  </profile>

  <profile>
    <firstname>Niko</firstname>
    <lastname>De Vries</lastname>
    <address>Sterrelaan 34</address>
    <zipcode>3342 JH</zipcode>
    <city>Amsterdam</city>
    <email>niko@hotmail.com</email>
  </profile>

  <profile>
    <firstname>Marcel</firstname>
    <lastname>Janssens</lastname>
    <address>Voorhoeveweg 11</address>
    <zipcode>6006SV</zipcode>
    <city>Weert</city>
    <email>marcel.j@hotmail.com</email>
  </profile>

  <profile>
    <firstname>Amin</firstname>
    <lastname>Ziarkash</lastname>
    <address>Melisstokelaan 2068</address>
    <zipcode>2541 GH</zipcode>
    <city>Den Haag</city>
    <email>a.ziarkash@hotmail.com</email>
  </profile>

  <profile>
    <firstname>Kevin</firstname>
    <lastname>De Vries</lastname>
    <address>Stuyvesantweg 2</address>
    <zipcode>2541 GH</zipcode>
    <city>Wolvega</city>
    <email>kevin@hotmail.com</email>
  </profile>

  <profile>
    <firstname>Niko</firstname>
    <lastname>De Vries</lastname>
    <address>Sterrelaan 34</address>
    <zipcode>3342 JH</zipcode>
    <city>Amsterdam</city>
    <email>niko@hotmail.com</email>
  </profile>

  <profile>
    <firstname>Gido</firstname>
    <lastname>Van der Veen</lastname>
    <address>Klausstraat 12</address>
    <zipcode>7726 GH</zipcode>
    <city>Den Haag</city>
    <email>gido.j@hotmail.com</email>
  </profile>

  <profile>
    <firstname>Nilo</firstname>
    <lastname>Yaqobi</lastname>
    <address>Kamperslaan 15</address>
    <zipcode>3728 JH</zipcode>
    <city>Delft</city>
    <email>nilo@hotmail.com</email>
  </profile>

  <profile>
    <firstname>Casper</firstname>
    <lastname>Van Zanten</lastname>
    <address>Molenweg 98</address>
    <zipcode>3411 HJ</zipcode>
    <city>Amsterdam</city>
    <email>Casper.j@hotmail.com</email>
  </profile>

  <profile>
    <firstname>Geert</firstname>
    <lastname>Diujkstra</lastname>
    <address>Binnenszijde 47</address>
    <zipcode>5362 PL</zipcode>
    <city>Amsterdam</city>
    <email>geert@hotmail.com</email>
  </profile>

  <profile>
    <firstname>Thijs</firstname>
    <lastname>Venema</lastname>
    <address>Koolstraat 21</address>
    <zipcode>6473 AA</zipcode>
    <city>Amsterdam</city>
    <email>venema@hotmail.com</email>
  </profile>

</profiles>
编辑

我为解析创建了一个单独的类,以简化过程。现在我想从原始ViewController类的viewDidLoad中的这个类(XMLParser类)加载-(void)loadXML,但它给了我错误。。有人能告诉我我做错了什么吗

ViewController.m

#import "ViewController.h"
#import "XMLParser.h"


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self XMLParser:loadXML];

}
XMLParser.h

#import <Foundation/Foundation.h>
#import "ViewController.h"

@interface XMLParser : NSObject

{
    NSMutableArray *profile;
    NSString *firstName;
}

- (void)loadXMLByURL:(NSString *)urlString; //Added after edit
- (void)loadXML; //Added after edit

@end

为什么
loadXMLByURL:
返回
self
?为什么
viewdiload
创建
ViewController
?非常奇怪。@Trojan这就是我如何让它工作的,对不起,我是objective-C新手,所以还没有太多经验。。你建议我怎么做?虽然它似乎是这样工作的,但它输出我想要的名称。这很好,因为您有一个自定义类来执行XML解析(并可能以某种形式存储它),但是它不是视图控制器,所以称它为
XmlParser
(或类似的名称),并从
NSObject
派生它。这也可以执行重复过滤。但是,无需从
loadXMLByURL:
返回
self
,如果该方法不可能出现错误,则返回
BOOL
void
。@特洛伊木马感谢您的回答,我将loadXMLByURL“code”更改为void,并在viewDidLoad中加载“code”。我用[self-loadXMLByURL:@“…”;”来称呼它代码'。我不明白你的意思:所以称它为XmlParser(或类似的),并从NSObject派生它。你能再解释一下吗?对于重叠过程..看起来您有一个名为
ViewController
的类,在该类中,您可以在加载视图时创建另一个实例。这是错误的。创建另一个XML解析器类,并将与加载和筛选XML数据相关的所有功能放在该类中。
#import <Foundation/Foundation.h>
#import "ViewController.h"

@interface XMLParser : NSObject

{
    NSMutableArray *profile;
    NSString *firstName;
}

- (void)loadXMLByURL:(NSString *)urlString; //Added after edit
- (void)loadXML; //Added after edit

@end
#import "XMLParser.h"

@implementation XMLParser

bool isStatus;
XMLParser1 *currentProfile;
XMLParser1 *xmlParser;
NSXMLParser *parser;
NSMutableString *currentNodeContent;

-(void)loadXMLByURL:(NSString *)urlString
{
    profile = [[NSMutableArray alloc] init];
    NSURL *url = [NSURL URLWithString:urlString];
    NSData *data = [[NSData alloc] initWithContentsOfURL:url];
    parser = [[NSXMLParser alloc] initWithData:data];
    parser.delegate = self;
    [parser parse];
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if([elementName isEqualToString:@"firstname"])
    {
        currentProfile = [XMLParser1 alloc];
        isStatus = YES;
    }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if([elementName isEqualToString:@"firstname"])
    {
        currentProfile->firstName = currentNodeContent;
        NSLog(@"%@",currentProfile->firstName);
        [profile addObject:currentProfile];
    }
}

- (void)loadXML
{
    [self loadXMLByURL:@"http://dierenpensionlindehof.nl/profiles1.xml"];
}

@end