Re: Escape xml with CFXMLCreateStringByEscapingEntities
Re: Escape xml with CFXMLCreateStringByEscapingEntities
- Subject: Re: Escape xml with CFXMLCreateStringByEscapingEntities
- From: Andreas Grosam <email@hidden>
- Date: Fri, 02 Dec 2011 14:11:05 +0100
On Dec 1, 2011, at 9:19 AM, Claude Saelens wrote:
> Hello,
>
> I need to put XML fragments into another XML. Each time an XML fragment is put into another XML it needs to be escaped to be send to backend a java application. I used the function "CFXMLCreateStringByEscapingEntities" but it seems it can only escape an XML fragment once, the second time strange characters are added.
>
> For this is wrote following method:
>
> -(NSMutableString*)xmlEscape:(NSMutableString*)xmlString
> {
> NSMutableString *aNSString = [NSMutableString stringWithString:xmlString];
> CFStringRef aCFString;
> CFStringRef bCFString;
> aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding);
> bCFString = CFXMLCreateStringByEscapingEntities(kCFAllocatorDefault, aCFString, NULL);
>
> NSMutableString *returnValue = [NSMutableString stringWithString:(NSMutableString*)bCFString];
>
> CFRelease(aCFString);
> CFRelease(bCFString);
>
> return returnValue;
> }
>
> The result is as follow:
>
> First fragment:
>
> <item type="Struct">
> <item name="path">Links/lets&dance.jpg</item>
> <item name="spread_index">0</item>
> </item>
> <item type="Struct">
> <item name="path">Links/doubles_1/lets&dance.jpg</item>
> <item name="spread_index">0</item>
> </item>
>
> Escaping this and put in a second fragment gives:
>
> <item type="Struct">
> <item name="level_id">4_2</item>
> <item name="images" type="Array"><item type="Struct">
> <item name="path">Links/lets&dance.jpg</item>
> <item name="spread_index">0</item>
> </item>
> <item type="Struct">
> <item name="path">Links/doubles_1/lets&dance.jpg</item>
> <item name="spread_index">0</item>
> </item>
> </item>
> </item>
>
> Escaping this fragment again gives:
>
> <item type="Struct">
> <item name="level_id">4_2</item>
> <item name="images" type="Array">قÄ-&lt;قÄ،item typeقÄ-=&quot;قÄ،StructقÄ-&quot;&gt;قÄ،
> قÄ-&lt;قÄ،item nameقÄ-=&quot;قÄ،pathقÄ-&quot;&gt;قÄ،Links/lets&amp;dance.jpgقÄ-&lt;/قÄ،itemقÄ-&gt;قÄ،
> قÄ-&lt;قÄ،item nameقÄ-=&quot;قÄ،spread_indexقÄ-&quot;&gt;قÄ،0قÄ-&lt;/قÄ،itemقÄ-&gt;قÄ،
> قÄ-&lt;/قÄ،itemقÄ-&gt;قÄ،
> قÄ-&lt;قÄ،item typeقÄ-=&quot;قÄ،StructقÄ-&quot;&gt;قÄ،
> قÄ-&lt;قÄ،item nameقÄ-=&quot;قÄ،pathقÄ-&quot;&gt;قÄ،Links/doubles_1قÄ-/قÄ،lets&amp;dance.jpgقÄ-&lt;/قÄ،itemقÄ-&gt;قÄ،
> قÄ-&lt;قÄ،item nameقÄ-=&quot;قÄ،spread_indexقÄ-&quot;&gt;قÄ،0قÄ-&lt;/قÄ،itemقÄ-&gt;قÄ،
> قÄ-&lt;/قÄ،itemقÄ-&gt;قÄ،
> </item>
> </item>
>
>
> Has anyone a solution for this problem?
>
> Thanks a lot for your help.
You didn't show the relevant code. (Your code above performs a couple of unnecessary copies).
On Lion 10.7.2, using Xcode 4.2.1 with default Foundation Template, this works for me:
int main (int argc, const char * argv[])
{
@autoreleasepool {
CFStringRef input = CFSTR("<item type=\"Struct\">\n"
"<item name=\"path\">Links/lets&dance.jpg</item>\n"
"<item name=\"spread_index\">0</item>\n"
"</item>\n"
"<item type=\"Struct\">\n"
"<item name=\"path\">Links/doubles_1/lets&dance.jpg</item>\n"
"<item name=\"spread_index\">0</item>\n"
"</item>");
NSLog(@"input:\n%@\n\n", input);
CFStringRef firstOut = CFXMLCreateStringByEscapingEntities(
kCFAllocatorDefault,
input,
NULL);
NSLog(@"output:\n%@\n\n", (id)firstOut);
NSString* format = @"<item type=\"Struct\">\n"
@"<item name=\"level_id\">4_2</item>\n"
@"<item name=\"images\" type=\"Array\">%@</item>\n"
@"</item>";
NSString* second = [NSString stringWithFormat:format, (id)firstOut];
CFStringRef secondOut = CFXMLCreateStringByEscapingEntities(
kCFAllocatorDefault,
(CFStringRef)second,
NULL);
NSLog(@"secondOut:\n%@\n\n", (id)secondOut);
CFRelease(firstOut);
CFRelease(secondOut);
}
return 0;
}
2011-12-02 14:06:21.593 XMLEscape[61121:707] input:
<item type="Struct">
<item name="path">Links/lets&dance.jpg</item>
<item name="spread_index">0</item>
</item>
<item type="Struct">
<item name="path">Links/doubles_1/lets&dance.jpg</item>
<item name="spread_index">0</item>
</item>
2011-12-02 14:06:21.595 XMLEscape[61121:707] output:
<item type="Struct">
<item name="path">Links/lets&dance.jpg</item>
<item name="spread_index">0</item>
</item>
<item type="Struct">
<item name="path">Links/doubles_1/lets&dance.jpg</item>
<item name="spread_index">0</item>
</item>
2011-12-02 14:06:21.596 XMLEscape[61121:707] secondOut:
<item type="Struct">
<item name="level_id">4_2</item>
<item name="images" type="Array">&lt;item type=&quot;Struct&quot;&gt;
&lt;item name=&quot;path&quot;&gt;Links/lets&amp;dance.jpg&lt;/item&gt;
&lt;item name=&quot;spread_index&quot;&gt;0&lt;/item&gt;
&lt;/item&gt;
&lt;item type=&quot;Struct&quot;&gt;
&lt;item name=&quot;path&quot;&gt;Links/doubles_1/lets&amp;dance.jpg&lt;/item&gt;
&lt;item name=&quot;spread_index&quot;&gt;0&lt;/item&gt;
&lt;/item&gt;</item>
</item>
Regards
Andreas
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden