• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Parser parst nicht richtig

.holger

Borowitzky
Registriert
13.09.04
Beiträge
8.971
Moin moin,

ich habe einen XML Parser, der einfach nicht das macht was ich will. Meine XML Datei ist wie folgt aufgebaut:

Code:
<?xml version="1.0" encoding="utf-8"?>
<mitarbeiterliste>
	<mitarbeiterentry>
		<mitarbeitername><![CDATA[Franz Müller]]></mitarbeitername>
		<mitarbeitertitel><![CDATA[Leiter des tollen Büros]]></mitarbeitertitel>
		
		<mitarbeiterstrasse><![CDATA[Rothenbaumchaussee 11]]></mitarbeiterstrasse>
		<mitarbeiterstadt><![CDATA[20148 Hamburg]]></mitarbeiterstadt>
		<mitarbeitertelefonnummer><![CDATA[+49 40 469662 273]]></mitarbeitertelefonnummer>
		<mitarbeiterfaxnummer><![CDATA[+49 40 469662 100]]></mitarbeiterfaxnummer>
		<mitarbeiteremail><![CDATA[barghahn(at)molis.de]]></mitarbeiteremail>
		
	</mitarbeiterentry>

</mitarbeiterliste>

mein Parser so:

Code:
@implementation mitarbeiterparsen

- (mitarbeiterparsen *) initXMLParser {

	[super init];
	appDelegate = (MolisAppDelegate *)[[UIApplication sharedApplication] delegate];
	
	return self;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
	attributes:(NSDictionary *)attributeDict {

	if([elementName isEqualToString:@"mitarbeiterliste"]) {
		NSLog(@"mitarbeiterliste");
		appDelegate.mitarbeiter2 = [[NSMutableArray alloc] init];
	}
	else if([elementName isEqualToString:@"mitarbeiterentry"]) {
		
		NSLog(@"mitarbeiterentry");

		amitarbeiter = [[mitarbeiter alloc] init];

	}

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
	NSLog(@"Parser");
	if(!currentElementValue) 
	{	currentElementValue = [[NSMutableString alloc] initWithString:string];
		NSLog(@"@%",currentElementValue);
	}
	else{
		[currentElementValue appendString:string];
	}
	
	
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
	NSLog(@"ein Endelement gefunden");

	if([elementName isEqualToString:@"mitarbeiterliste"])
	{
		NSLog(@"Liste abgearbeitet");

		return;
	}
	if([elementName isEqualToString:@"mitarbeiterentry"]) {
		[appDelegate.mitarbeiter2 addObject:amitarbeiter];
		NSLog(@"close Entry");

		[amitarbeiter release];
		amitarbeiter = nil;
	}
	if 

		
		([elementName isEqualToString:@"mitarbeitername"] ||
		   [elementName isEqualToString:@"mitarbeitername"] ||
		   [elementName isEqualToString:@"mitarbeiterstrasse"] ||
		   [elementName isEqualToString:@"mitarbeiterstadt"] ||
		   [elementName isEqualToString:@"mitarbeiteremail"] ||
		   [elementName isEqualToString:@"mitarbeitertelefonnummer"] ||
		   [elementName isEqualToString:@"mitarbeiterfaxnummer"]
		   ) {
			[amitarbeiter setValue:currentElementValue forKey:elementName];
			NSLog(@"%@",elementName);
			NSLog(@"hab was gefunden");

		}
		
		
		[currentElementValue release];
		currentElementValue = nil;
	}


- (void) dealloc {
	
	[amitarbeiter release];
	[currentElementValue release];
	[super dealloc];
}

@end

die Startelemente werden alle korrekt gefunden, denn die Ausgabe ergibt:

[Session started at 2010-04-26 20:53:00 +0200.]
2010-04-26 20:53:03.936 parsertest[1193:207] mitarbeiterliste
2010-04-26 20:53:03.937 parsertest[1193:207] Parser
2010-04-26 20:53:03.938 parsertest[1193:207] mitarbeiterentry
2010-04-26 20:53:03.938 parsertest[1193:207] Parser

Er geht also nicht einmal in den Teil des "didEndElement" hinein. Was mach ich nur falsch (ist sicher nur ne Kleinigkeit, die ich vor lauter Code nicht sehe…).
 
du benutzt ja auch ein XML-encoding, welches die Umlaute in dieser Form nicht unterstützt. Ich glaube, mit einem anderen encoding wäre das kein Problem.

Gruss ppocket

PS: Versuchs mit ISO-8859-1 :-)
 
Hehe, klappt, aber irgendwie will das alles nicht. Ich hab noch ne andere XML (die auf nem Server generiert wird, auf den ich keinen Zugriff hab - ich kann dem Admin nur sagen "änder das und das" und dann macht der das).

In der XML steht, dass es UTF-8 sein soll, aber das iPhone (und auch diverse Texteditoren und Safari auf dem Mac) zeigen die ganzen Umlaute nicht an. Es liegt also wohl an der Datei. Nur was für ein Encoding könnte das sein? Auch das Öffnen als ISO-8859-1 bringt nichts, dann sind die Umlaute nur anders kaputt.

Gib es ne Möglichkeit das Encoding zu irgendwie zu checken?
 
In der XML steht, dass es UTF-8 sein soll, aber das iPhone (und auch diverse Texteditoren und Safari auf dem Mac) zeigen die ganzen Umlaute nicht an.
Und Du hast diese Dateien auch mit UTF-8 Codierung geöffnet bzw. in Safari unter "Darstellung->Textcodierung->Unicode (UTF-8)" ausgewählt?

Gib es ne Möglichkeit das Encoding zu irgendwie zu checken?
Nicht wirklich.

MacApple
 
ja, leider führt das auch nicht zum Erfolg.

Ich schick dir mal nen Link, falls Du dir das angucken magst.
 
Ist in diesem File dann wirklich auch UTF-8 codiert? oder das encoding-tag einfach so hingesetzt worden?
 
das ist wohl einfach so hingesetzt worden. Ich hab gestern den Webmaster gesagt, er soll sich das Encoding des XLM-Export-Scripts nochmal angucken und wie durch ein Wunder sind seit heute Mittag alle Umlaute richtig in der App zu sehen… :-)

Da sieht man mal wieder, dass es sich manchmal lohnt den Fehler bei anderen zu suchen ;-)
 
Das kann man immer schnell machen. Ein encoding hinsetzen und sich gar keine Gedanken darüber machen, sich dann auch daran zu halten, Hauptsache, es steht ein encoding und die Datei wird dadurch WW3-konform.

Hatte auch schon so feine Kollegen! Gross protzen, sie dürfen das WW3-Zertifikat auf die Website packen. Und auf dem Mac/Linux, welcher sich dann anders als Windows ums encoding kümmert, läuft nix mehr.

Gruss ppocket