NSXMLParser: Unexpected result with non-ASCII characters

The parser:foundCharacters: delegate method can be called more than
once for a single XML element. In your example, it would be called
once with “Contabilit”, and once with “à nazionale”.

Therefore you have to concatenate
the found strings from didStartElement until didEndElement.

Here is a very simply example how this can be done. Of course it gets
more complicated if you have nested XML elements.

Add a property for the current element string to your class:

var currentElement : String?

And then implement the delegate methods like this:

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {

    // If a "Name" element started (which you are interested in), set
    // currentElement to an empty string, so that the found characters
    // can be collected. Otherwise set it to nil.
    if elementName == "Name" {
        currentElement = ""
    } else {
        currentElement = nil
    }

}

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {

    // If the "Name" element ended, get the collected string and
    // append it to your list.
    if elementName == "Name" {
        if let name = currentElement {
            println(name)
            myList.append(name)
        }
    }
    currentElement = nil
}

func parser(parser: NSXMLParser, foundCharacters string: String?) {

    // If currentElement is not nil, append the found characters to it:
    currentElement? += string ?? ""
}

Leave a Comment