0

I have some xml that contains a BASE 64 ENCODED PNG IMAGE I am trying to parse this into an object of some type.. for the moment into a NSArray of NSDictionaries, however I am currently unsuccessful doing so.

This is part of my parse delegate:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if([elementName isEqualToString:@"GUI"]){
        parsedGUIMutableDictionary = [[NSMutableDictionary alloc] initWithDictionary:attributeDict];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

    if ([elementName isEqualToString:@"GUI"]) {
        [parsedDataArrayOfDictionaries addObject:parsedGUIMutableDictionary];

    }


}

Once this is done there are no values saved into the dictionary so it's just empty... I have added a breakpoint in both if statements and when the first if statement is entered attributeDict is empty.

This is what the xml looks like:

<IC>

  <Reps>

    <GUI>iVBORw0KGgoAAAANSUhEUgAAAiwAAAFKCAMAAAF+68SXAAADAFBMVEUAAAAAADMAAGYAAJkAAMwA

AP8AMwAAMzMAM2YAM5kAM8wAM/8AZgAAZjMAZmYAZpkAZswAZv8AmQAAmTMAmWYAmZkAmcwAmf8A

zAAAzDMAzGYAzJkAzMwAzP8A/wAA/zMA/2YA/5kA/8wA//8zAAAzADMzAGYzAJkzAMwzAP8zMwAz

MzMzM2YzM5kzM8wzM/8zZgAzZjMzZmYzZpkzZswzZv8zmQAzmTMzmWYzmZkzmcwzmf8zzAAzzDMz

zGYzzJkzzMwzzP8z/wAz/zMz/2Yz/5kz/8wz//9mAABmADNmAGZmAJlmAMxmAP9mMwBmMzNmM2Zm

M5lmM8xmM/9mZgBmZjNmZmZmZplmZsxmZv9mmQBmmTNmmWZmmZlmmcxmmf9mzABmzDNmzGZmzJlm

zMxmzP9m/wBm/zNm/2Zm/5lm/8xm//+ZAACZADOZAGaZAJmZAMyZAP+ZMwCZMzOZM2aZM5mZM8yZ

M/+ZZgCZZjOZZmaZZpmZZsyZZv+ZmQCZmTOZmWaZmZmZmcyZmf+ZzACZzDOZzGaZzJmZzMyZzP+Z

/wCZ/zOZ/2aZ/5mZ/8yZ///MAADMADPMAGbMAJnMAMzMAP/MMwDMMzPMM2bMM5nMM8zMM//MZgDM

ZjPMZmbMZpnMZszMZv/MmQDMmTPMmWbMmZnMmczMmf/MzADMzDPMzGbMzJnMzMzMzP/M/wDM/zPM

/2bM/5nM/8zM////AAD/ADP/AGb/AJn/AMz/AP//MwD/MzP/M2b/M5n/M8z/M///ZgD/ZjP/Zmb/

Zpn/Zsz/Zv//mQD/mTP/mWb/mZn/mcz/mf//zAD/zDP/zGb/zJn/zMz/zP///wD//zP//2b//5n/

/8z///8AAAANDQ0aGhooKCg1NTVDQ0NQUFBdXV1ra2t4eHiGhoaTk5OhoaGurq67u7vJycnW1tbk

5OTx8fH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAABGUgBlAAAACXBIWXMAAAsSAAALEgHS3X78AAAACXRFWHRDb21tZW50AACJKo0G

AAALi0lEQVR4nO2da3LiOBRGU8UO2EzvL396CbORbCIrcJVN3p0HXsXwatrAZ1uWr2TJPocehhAh

Xz4fhCMU564w4W5A24cHk25qm246GNLNyqabDvKtJv9uOvKcppsBPU3QjY9+s69mdSKNanbcF8lk

M303w6CbK9b//g3o5semmrJMqpsqqWqidtPVrI8h3Xw7dTOGOXYzoJe6/SB90KG+RS1F7dzL/YBe

/WqhF3rJffsdfff5Yq1eLXrpOWqidtPVrI8h3Xw7dWqidtPVrI8h3Xw7dWqidPaL3kuVUC1Ovbz1

Hn/39vLLoZfgh9/z6+WahwNDHxWmlsKnlFC1dH080EqoWnygFo1bLe0/67UwbE79RH65HBnwZBeV

y4GVI1Fq8diII5619D3vOL6s/LfVx7haWktaeC62UIuGWjTUosm6loBQi4ZaNHdfB74tGfwTzN9a

Tv/flLaMqcWUsuyYT2snTC2VVzCBckmpllnuo6ddxJuRWNXy5vmabOIzxtx93PJcVZW425l3z2eS

1HvA1AU0mH0ttde0d8g5+MGPClNL7VNKwM8Dhj8oUC0dy/zbCfbZhMdjMqrFa250/7gQtXhVUoTJ

xauQYim1DC9pGbUMh1o0oWsZ8rnaknIZwuJqcfy4cXG5OLLQWvqWqONLC9SiiV5Lx+TTonPpgFpk

G8a6Fqjl1DChY6nrhtSSai3naawEfPnXnFqohVrGQy0aatFQi4ZaNPnUcv5Vz1+Nf8c1bd+2a9r6

a9Eccqk353JNKLtradsXp/u/jZfXbUfUYsuuGGqhFpNa1tRCLdQSuxaDZaobw1o6fs/fjYRqGb+P

1la1lH65iPW3VVW9jVm/W37a7SML8jn21lCLZgm12PPQIPjG8omlkYvv71q5k1EsRbxUsoqliJZK

XrEUsVLJLJYiUiq5xeL1buvBuFgCnnmlhTxiuY8azGqVSSxGVbhDLBJikWQXi+tJuMaRXSxxIBYJ

sUjyjsX3d1V7NsdxSwvEIiEWyVxiWXn+SZGWzRGL3Nx8YjGFWCRzjMUgolnGMnLWakaHc9jS24RY

ZBNikU0MZq3mHosnxCIhFsmiYnGcteK4pQ1ikRCLZKGxdE7PzHS+hVhkE4PpGWKREItsTiy3s1bL

PZzDFq/mxEIs7s2JhVjcm2cRS3yIRUIsEmKREIuEWCTEIiEWCbFIiEUyJpb12vW6uHv5S/n8ki5V

Wf2MimXg7m82/yw3P/++WludBc6Kr3I7SSxJc/rLscRyyemUf8Ryyf6PxhLLDftMKmK5xvtFdHrH

HfagjGLxfBHNPRbPF9H8Y8GWG3gRSXgRSZJ8EdX1dkc9IUnG8nYsavQZScdCLIotsQjKT4+foI1j

uZhvSSCWp3J/HSuWj/csLttTvczlSohFQiwSYpEQy5RkE0vNSaclMVPJKJaaWCQRz1CeUyx1PFly

iqWIJ0tWsdTRZMkqliKaLHnFUseSJa9YiliyZBZLHUmWzGIpIsmSXSyRtkMsEmKRjIwlzFmUW7d2

Tyxqa7nEEhtikRCLhFgkxCIhFkl2sVieiryN+wxjiUJ+sWCLIs7hLrFIiEVCLBJikWQdS7iI8o4l

0N8szXC+hVgkvIgkxCIhFgmxSIhFQiyS9ljsQsp8YsHgD+7MZxpK3y5qbBG3bSEWCbFIiEVCLBJi

kcwzlpGrhOY630IsYSAWCbFIiEVCLBJikcw9Fq/lMPOfWFj8NFRbc2zpaT4AYpEQi4RYJMQiWVIs

AyJaVCyuq4TmP99CLBbN/0IsEmKREIuEWCTEIlluLB0PXtbEwoDFU//ZFNtLarF0Lp5ari09EIuE

WCTEIiEWCbFIiKW4XSXEfMvxG8TiBrFIiEVCLBJikRCLhFgkxCIhFgmxSIhFQiyS7GKJA7FIiEVC

LBJikRCLhFgkxCIhFgmxSIhFQiwSYpEQi4RYJMQiIRYJsUiIRTImlvWv9fX1Wl8vKpZi7Xxd3H2f

+Pra/UuV7+ixPJ+oqpeX58blZX359aSX57J8GxTLXfM5+sRyftBb+Sk6SYb38k8xRSxFsSnfG338

SiyXYvM0TSx7Y/6xLpNjM1Est50kwyGXd2K54ugLsVxBLBJikRCLhFgkxCIZGUtdEEtLLEXjTmI5

QCx7OmIpGt8ilqsGxNIBsUiIpQNikRBLB8QiIZYOiEWyhFj8IZaBj7+IZVvv2U5IkrGUZbW7lJuJ

</GUI>

  </Reps>

</IC>

I am hoping someone knows how to help me get the data from this XML so I can then use something similar to the code below to decode my png

[Base64 initialize];
NSData *data = [Base64 decode:img];
cell.image.image = [UIImage imageWithData:data];

any help would be greatly appreciated.

Malloc
  • 15,434
  • 34
  • 105
  • 192
HurkNburkS
  • 5,492
  • 19
  • 100
  • 183

1 Answers1

2

You probably don't want to bother with the NSDictionary. I'm not at my Mac, but try something like:

  1. Implement the foundCharacters callback in your delegate (NSXMLParserDelegate Protocol Reference).
  2. In the foundCharacters implementation check if you are between the didStartElement and didEndElement calls for the GUI element: if you are, append the characters to an NSMutableString instance.
  3. In didEndElement you can then initialize an NSData instance using the NSMutableString using something like this.

That should get you where you need to be.

Community
  • 1
  • 1
Femi
  • 64,273
  • 8
  • 118
  • 148
  • There is something in the apple docs but im not sure what they are doing with the mutableString value **- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if (!currentStringValue) { // currentStringValue is an NSMutableString instance variable NSMutableString *currentStringValue = [[NSMutableString alloc] initWithCapacity:50]; } [currentStringValue appendString:string]; }** – HurkNburkS May 23 '13 at 02:17
  • 1
    You don't want to create a new instance every time: `foundCharacters` can be called multiple times depending on the chunks it fetches. Create the instance in `didStartElement` and then just call `appendString` in `foundCharacters`. – Femi May 23 '13 at 02:23