Indsæt Objective-C til venstre og klik på "Konvertér" — vi laver XML ud af detIndsæt Objective-C-kode

Det her gør værktøjet

Hvis du nogensinde har måttet sno dig en XML-payload sammen i hånden, der matcher en Objective-C-model — til en gammel SOAP-tjeneste, en plist-fil, en Cocoa-konfig eller en test-fixture — kender du øvelsen. Du tæller @property-linjer, piller typekvalifikatorerne af, prøver at huske, hvilke der er NSArray-containere, og håber, at formen passer. Indsæt Objective-C her, og du får velformet XML retur i ét hug. En enkelt alloc/init-stump, en hel headerfil med flere @interface-blokke, eller en dybt indlejret model — samme resultat.

Det er ikke naiv tekst-substitution. Konverteren følger med i, hvordan Cocoa faktisk mapper til XML. NSString-værdier bliver til tekstnoder (korrekt escape'ede). NSNumber og NSDecimalNumber taber deres wrapper og bliver til almindelig numerisk tekst — så [NSDecimalNumber decimalNumberWithString:@"249.99"] kommer ud som 249.99. BOOL-værdier bliver til true / false, eller varianten YES / NO, hvis dit skema vil have det. NSArray<OrderItem *> bliver et container-element med ét barn per item, opkaldt efter elementtypen — samme form som træer af NSXMLElement udsender.

Backing via instansvariabler er også med. Bruger din @property @synthesize customerName = _customerName;, hedder elementet stadig customerName, ikke _customerName — det iVar-navn er en implementationsdetalje, ikke en del af wire-formatet. Indlejrede objekter (en Order med en Address-@property) foldes ud på stedet, og nil-værdier bliver til tomme elementer, så formen bliver konsekvent. Indsætter du flere @interface-blokke, lander alle i outputtet. Indsæt det, som det står i din .h-fil — ingen oprydning nødvendig — og sammenlign resultatet med det, NSXMLDocument ville producere.

Sådan bruger du det

Tre trin. Fungerer ens, uanset om du indsætter én klasse eller et helt header-bundt.

1

Indsæt din Objective-C (eller prøv eksemplet)

Smid din Objective-C i venstre editor, som den er. En @interface-blok, en alloc/init-objektliteral, flere klasser eller indlejrede typer — det hele dur. Klik på Indlæs eksempel for at se et realistisk Order / OrderItem / Address-eksempel først.

Du behøver ikke pille @property-attributter af, fjerne pragmas eller rydde op i import-linjer. Lad koden stå, som den ser ud i Xcode. Parseren kan læse en rigtig .h- eller .m-fil.

2

Tryk Konvertér

Klik på den grønne Konvertér-knap. Værktøjet læser Objective-C'en, beholder hver @property, bevarer indlejrede objekter og bygger XML'en i ét hug. Imens løber en kort loading-indikator.

3

Kopiér XML'en

Højre panel fyldes med indrykket, velformet XML, som enhver standardkonform parser — herunder NSXMLParser — godtager. Kopiér den ind i en plist, en SOAP-request-body, en test-fixture eller din dokumentation.

Når det virkelig hjælper

Bygge plist-fixtures til iOS

Du har en Objective-C-model og skal bruge en matchende Info.plist eller seed-plist. Indsæt klassen, hent XML'en, smid den i dit bundle — ingen håndskrevne <code>&lt;dict&gt;</code> / <code>&lt;key&gt;</code>-par.

Cocoa XML-konfigfiler

Gamle desktop-Cocoa-apps sender stadig XML-konfig med. Lav din <code>Settings</code>-klasse om til en klar-til-at-redigere-skabelon, så konfigurationen matcher koden, der læser den.

Legacy SOAP- / WCF-klienter på iOS

Taler din iOS-app stadig med et SOAP-endpoint, kan du indsætte request-kontraktklassen og få XML-envelope-bodyen — lettere end at bygge <code>NSXMLElement</code>-træer i hånden.

Fodre Mac OS XML-workflows

Gamle AppleScript- / Automator- / XML-RPC-integrationer forventer XML. Indsæt Objective-C-modellen, hent XML'en, send den ind i workflowet — ingen manuel oversættelse.

Typiske spørgsmål

Kan jeg indsætte flere @interface-deklarationer ad gangen?

Ja. Indsæt en hel headerfil. Hver @interface kommer igennem med indlejrede typer foldet ud. Uanset om din @interface deklarerer ivars eksplicit (inden i { }) eller bruger den moderne kun-@property-stil, fungerer begge ens.

Hvordan håndteres @property-attributter?

Attributter som (nonatomic, copy), (strong), (weak), (readonly) og (assign) er metadata til runtimen — de ændrer ikke den serialiserede form. Elementnavnet er propertyens navn. readonly-properties bliver stadig udsendt (de har stadig en værdi). Beregnede properties med egne getters behandles som enhver anden property.

Og iVar-navne — får jeg elementer med _understreg?

Nej. Hvis din property hedder customerName og backing-iVar'en er _customerName, bliver XML-elementet <customerName>. Understregen er en Objective-C-konvention, ikke et wire-format. Vil du omdøbe et element, så omdøb selve @property og indsæt igen.

Hvordan behandles NSString, NSNumber, NSDecimalNumber, BOOL og NSDate?

NSString bliver til en tekstnode med korrekt XML-escape. NSNumber og NSDecimalNumber taber deres wrapper og bliver til almindelig numerisk tekst. BOOL bliver til true / false (eller YES / NO, hvis kildekoden bruger plist-konventionen). NSDate kommer ud som en ISO-8601-streng. nil-værdier bliver til tomme elementer i stedet for bare at forsvinde.

Hvad med NSArray, NSDictionary og indlejrede objekter?

NSArray<OrderItem *> bliver et container-element med ét barn per item, opkaldt efter elementtypen: <items><OrderItem/><OrderItem/></items>. NSDictionary bliver en container af <entry><key/><value/></entry>. Indlejrede objekter (en property, hvis type er et andet @interface) foldes ud på stedet med alle felter intakte.

Bliver min kode gemt?

Din kode sendes til backenden til konverteringen og bliver ikke gemt — vi logger ikke payloaden. Som altid med onlineværktøjer: er koden virkelig følsom, så kig den igennem, før du indsætter.

Andre værktøjer, du kan få brug for

Objective-C til XML er bare en brik i puslespillet. De her værktøjer passer godt sammen med det: