Sample code for 30+ languages & platforms
Objective-C

Xero Create New Accounts

Demonstrates how to create a new account in Xero.

Chilkat Objective-C Downloads

Objective-C
#import <CkoRest.h>
#import <CkoStringBuilder.h>
#import <CkoHashtable.h>
#import <CkoXml.h>
#import <NSString.h>

BOOL success = NO;

//  This requires the Chilkat API to have been previously unlocked.
//  See Global Unlock Sample for sample code.

CkoRest *rest = [[CkoRest alloc] init];

//  Before sending REST API calls, the REST object needs to be
//  initialized for OAuth1.
//  See Xero 2-Legged OAuth1 Setup for sample code.

//  Assuming the REST object's OAuth1 authenticator is setup, and the initial
//  connection was made, we may now send REST HTTP requests..

//  --------------------------------------------------------------
//  To add certain accounts, we need a unique Code that hasn't yet been used.
//  Chilkat provided an example to download and save the Accounts data.
//  We can load this data into a hashtable to help us find an unused Code.
//  See Hash Xero Account Codes to see how this file was created.
CkoStringBuilder *sbAccounts = [[CkoStringBuilder alloc] init];
success = [sbAccounts LoadFile: @"qa_cache/xero_accounts_by_code.xml" charset: @"utf-8"];
if (!success) {
    NSLog(@"%@",@"failed to load xero_accounts_by_code.xml");
    return;
}

CkoHashtable *htAccounts = [[CkoHashtable alloc] init];
[htAccounts AddFromXmlSb: sbAccounts];

//  --------------------------------------------------------------
//  Build the request XML to create a Xero sales account.
//  Find an unused Code...
int code = 600;
while ([htAccounts ContainsIntKey: [NSNumber numberWithInt: code]] == YES) {
    code = code + 1;
}

CkoXml *xml = [[CkoXml alloc] init];
xml.Tag = @"Account";
[xml NewChildInt2: @"Code" value: [NSNumber numberWithInt: code]];
[xml NewChild2: @"Name" content: @"Sales - clearance lines"];
[xml NewChild2: @"Type" content: @"SALES"];
xml.EmitCompact = YES;

//  Do not emit the XML declarator. Xero does not accept the XML if it
//  has the initial line: <?xml version="1.0" encoding="utf-8"?>
xml.EmitXmlDecl = NO;

[rest AddQueryParam: @"xml" value: [xml GetXml]];

rest.VerboseLogging = YES;
NSString *responseXml = [rest FullRequestFormUrlEncoded: @"PUT" uriPath: @"/api.xro/2.0/Accounts"];
if (rest.LastMethodSuccess == NO) {
    NSLog(@"%@",rest.LastErrorText);
    return;
}

//  A 200 response is expected for actual success.
if ([rest.ResponseStatusCode intValue] != 200) {
    NSLog(@"%@",responseXml);
    return;
}

//  Examine the XML response
NSLog(@"%@",responseXml);

//  A successful XML response is as follows:

//  <Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
//    <Id>dac71f1b-7afb-49a7-8a57-719b91f2088e</Id>
//    <Status>OK</Status>
//    <ProviderName>ChilkatPrivate</ProviderName>
//    <DateTimeUTC>2016-11-10T23:53:43.487791Z</DateTimeUTC>
//    <Accounts>
//      <Account>
//        <AccountID>cb8c94cf-57d4-41ee-b866-4c27632fe838</AccountID>
//        <Code>601</Code>
//        <Name>Sales - clearance lines</Name>
//        <Status>ACTIVE</Status>
//        <Type>SALES</Type>
//        <TaxType>OUTPUT</TaxType>
//        <Class>REVENUE</Class>
//        <EnablePaymentsToAccount>false</EnablePaymentsToAccount>
//        <ShowInExpenseClaims>false</ShowInExpenseClaims>
//        <ReportingCode>REV</ReportingCode>
//        <ReportingCodeName>Revenue</ReportingCodeName>
//        <UpdatedDateUTC>2016-11-10T23:53:43.94</UpdatedDateUTC>
//      </Account>
//    </Accounts>
//  </Response>

//  To access the information:
[xml LoadXml: responseXml];

NSLog(@"%@%@",@"AccountID: ",[xml GetChildContent: @"Accounts|Account|AccountID"]);
NSLog(@"%@%@",@"TaxType: ",[xml GetChildContent: @"Accounts|Account|TaxType"]);
//  ..