Eliminating the Occurence of junk Values in an NSString? - objective-c

I am getting an XML in the below mentioned Format....
<META NAME="ColdFusionMXEdition" CONTENT="ColdFusion DevNet Edition - Not for Production Use.">
<?xml version="1.0" encoding="UTF-8"?>
<ParticipantService>
<Response>
<FileName>Alzheimers</FileName>
<playlist>
<question answer="t" qno="1" tin="113" title="Aide responds" tout="114"/>
<question answer="t" qno="2" tin="123" title="Receptionist reports problem" tout="126"/>
<question answer="t" qno="3" tin="127" title="Receptionist objects to restraint" tout="130"/>
.............
I am storing the above mentioned XML in the form of an NSString. Now i just want to capture the data starting from
<?xml version="1.0".......
From here i want to Parse the String which doesnt contain the META Tag characters. Can someone please post any alternative here?

You could try something like this:
NSString *parseString = [xmlString substringWithRange:NSMakeRange([xmlString rangeOfString: #"<?xml"].location, ([xmlString length] - [xmlString rangeOfString: #"<?xml"].location))];

NSString has plenty of methods to work with. Here's my solution which is similar to Peter's:
NSString *newString = [xmlString substringFromIndex:[xmlString rangeOfString:#"<?xml"].location];
or if you already have an NSMutableString:
[mutableXMLString deleteCharactersInRange:NSMakeRange(0, [mutableXMLString rangeOfString:#"<?xml"].location)];
Of course, neither solution tackles cases where there isn't any <?xml.

Related

GDataXML nodesForXPath on Node contains items of entire GDataXMLDocument

I am trying to create an iOS app which (besides a few other things) needs to load in the content of a Wordpress-Page
When I use the getPosts feature from Wordpress's XML-RPC feature, I get the following returned:
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<array><data>
<value><struct>
<member><name>post_id</name><value><string>23</string></value></member>
<member><name>post_title</name><value><string><!--:de-->Post1<!--:--><!--:en-->Post1<!--:--></string></value></member>
<member><name>post_date</name><value><dateTime.iso8601>20140211T14:26:39</dateTime.iso8601></value></member>
<member><name>post_date_gmt</name><value><dateTime.iso8601>20140211T12:26:39</dateTime.iso8601></value></member>
<member><name>post_modified</name><value><dateTime.iso8601>20140217T22:32:45</dateTime.iso8601></value></member>
<member><name>post_modified_gmt</name><value><dateTime.iso8601>20140217T20:32:45</dateTime.iso8601></value></member>
<member><name>post_status</name><value><string>publish</string></value></member>
<member><name>post_type</name><value><string>post</string></value></member>
<member><name>post_name</name><value><string>im-notfall</string></value></member>
<member><name>post_author</name><value><string>1</string></value></member>
<member><name>post_password</name><value><string></string></value></member>
<member><name>post_excerpt</name><value><string></string></value></member>
<member><name>post_content</name><value><string><!--:de--><b>Post1</b><!--:--><!--:en--><b>Post1</b><!--:--></string></value></member>
<member><name>post_parent</name><value><string>0</string></value></member>
<member><name>post_mime_type</name><value><string></string></value></member>
<member><name>link</name><value><string>http://example.com/ExampleProjekt/?p=23</string></value></member>
<member><name>guid</name><value><string>http://example.com/ExampleProjekt/?p=23</string></value></member>
<member><name>menu_order</name><value><int>5</int></value></member>
<member><name>comment_status</name><value><string>closed</string></value></member>
<member><name>ping_status</name><value><string>open</string></value></member>
<member><name>sticky</name><value><boolean>0</boolean></value></member>
<member><name>post_thumbnail</name><value><array><data>
</data></array></value></member>
<member><name>post_format</name><value><string>standard</string></value></member>
<member><name>terms</name><value><array><data>
<value><struct>
<member><name>term_id</name><value><string>1</string></value></member>
<member><name>name</name><value><string>Allgemein</string></value></member>
<member><name>slug</name><value><string>allgemein</string></value></member>
<member><name>term_group</name><value><string>0</string></value></member>
<member><name>term_taxonomy_id</name><value><string>1</string></value></member>
<member><name>taxonomy</name><value><string>category</string></value></member>
<member><name>description</name><value><string></string></value></member>
<member><name>parent</name><value><string>0</string></value></member>
<member><name>count</name><value><int>3</int></value></member>
</struct></value>
</data></array></value></member>
<member><name>custom_fields</name><value><array><data>
</data></array></value></member>
</struct></value>
<value><struct>
<member><name>post_id</name><value><string>9</string></value></member>
<member><name>post_title</name><value><string><!--:de-->Post2<!--:--><!--:en-->Post2<!--:--></string></value></member>
<member><name>post_date</name><value><dateTime.iso8601>20140206T13:16:56</dateTime.iso8601></value></member>
<member><name>post_date_gmt</name><value><dateTime.iso8601>20140206T11:16:56</dateTime.iso8601></value></member>
<member><name>post_modified</name><value><dateTime.iso8601>20140217T22:33:01</dateTime.iso8601></value></member>
<member><name>post_modified_gmt</name><value><dateTime.iso8601>20140217T20:33:01</dateTime.iso8601></value></member>
<member><name>post_status</name><value><string>publish</string></value></member>
<member><name>post_type</name><value><string>post</string></value></member>
<member><name>post_name</name><value><string>neuer-erster-beitrag</string></value></member>
<member><name>post_author</name><value><string>1</string></value></member>
<member><name>post_password</name><value><string></string></value></member>
<member><name>post_excerpt</name><value><string></string></value></member>
<member><name>post_content</name><value><string><!--:de--><b>Post2</b><!--:--><!--:en--><b>Post2</b><!--:--></string></value></member>
<member><name>post_parent</name><value><string>0</string></value></member>
<member><name>post_mime_type</name><value><string></string></value></member>
<member><name>link</name><value><string>http://example.com/ExampleProjekt/?p=9</string></value></member>
<member><name>guid</name><value><string>http://example.com/ExampleProjekt/?p=9</string></value></member>
<member><name>menu_order</name><value><int>3</int></value></member>
<member><name>comment_status</name><value><string>closed</string></value></member>
<member><name>ping_status</name><value><string>open</string></value></member>
<member><name>sticky</name><value><boolean>0</boolean></value></member>
<member><name>post_thumbnail</name><value><array><data>
</data></array></value></member>
<member><name>post_format</name><value><string>standard</string></value></member>
<member><name>terms</name><value><array><data>
<value><struct>
<member><name>term_id</name><value><string>1</string></value></member>
<member><name>name</name><value><string>Allgemein</string></value></member>
<member><name>slug</name><value><string>allgemein</string></value></member>
<member><name>term_group</name><value><string>0</string></value></member>
<member><name>term_taxonomy_id</name><value><string>1</string></value></member>
<member><name>taxonomy</name><value><string>category</string></value></member>
<member><name>description</name><value><string></string></value></member>
<member><name>parent</name><value><string>0</string></value></member>
<member><name>count</name><value><int>3</int></value></member>
</struct></value>
</data></array></value></member>
<member><name>custom_fields</name><value><array><data>
</data></array></value></member>
</struct></value>
<value><struct>
<member><name>post_id</name><value><string>5</string></value></member>
<member><name>post_title</name><value><string><!--:de-->Post3<!--:--><!--:en-->Post3<!--:--></string></value></member>
<member><name>post_date</name><value><dateTime.iso8601>20131217T17:32:09</dateTime.iso8601></value></member>
<member><name>post_date_gmt</name><value><dateTime.iso8601>20131217T15:32:09</dateTime.iso8601></value></member>
<member><name>post_modified</name><value><dateTime.iso8601>20140217T22:33:18</dateTime.iso8601></value></member>
<member><name>post_modified_gmt</name><value><dateTime.iso8601>20140217T20:33:18</dateTime.iso8601></value></member>
<member><name>post_status</name><value><string>publish</string></value></member>
<member><name>post_type</name><value><string>post</string></value></member>
<member><name>post_name</name><value><string>test-beitrag-2</string></value></member>
<member><name>post_author</name><value><string>1</string></value></member>
<member><name>post_password</name><value><string></string></value></member>
<member><name>post_excerpt</name><value><string></string></value></member>
<member><name>post_content</name><value><string><!--:de--><b>Post3</b><!--:--><!--:en--><b>Post3</b><!--:--></string></value></member>
<member><name>post_parent</name><value><string>0</string></value></member>
<member><name>post_mime_type</name><value><string></string></value></member>
<member><name>link</name><value><string>http://example.com/ExampleProjekt/?p=5</string></value></member>
<member><name>guid</name><value><string>http://example.com/ExampleProjekt/?p=5</string></value></member>
<member><name>menu_order</name><value><int>4</int></value></member>
<member><name>comment_status</name><value><string>closed</string></value></member>
<member><name>ping_status</name><value><string>open</string></value></member>
<member><name>sticky</name><value><boolean>0</boolean></value></member>
<member><name>post_thumbnail</name><value><array><data>
</data></array></value></member>
<member><name>post_format</name><value><string>standard</string></value></member>
<member><name>terms</name><value><array><data>
<value><struct>
<member><name>term_id</name><value><string>1</string></value></member>
<member><name>name</name><value><string>Allgemein</string></value></member>
<member><name>slug</name><value><string>allgemein</string></value></member>
<member><name>term_group</name><value><string>0</string></value></member>
<member><name>term_taxonomy_id</name><value><string>1</string></value></member>
<member><name>taxonomy</name><value><string>category</string></value></member>
<member><name>description</name><value><string></string></value></member>
<member><name>parent</name><value><string>0</string></value></member>
<member><name>count</name><value><int>3</int></value></member>
</struct></value>
</data></array></value></member>
<member><name>custom_fields</name><value><array><data>
</data></array></value></member>
</struct></value>
</data></array>
</value>
</param>
</params>
</methodResponse>
Now I'm trying to get a few fields I need (content, title, id, etc.) per post via the following two foreach-statements:
GDataXMLDocument *XMLdoc = [[GDataXMLDocument alloc] initWithData:XMLcontent options:0 error:nil];
NSArray *XMLofPosts = [XMLdoc nodesForXPath:#"//methodResponse/params/param/value/array/data/value" error:nil];
for(GDataXMLNode *post in XMLofPosts){
NSArray *postMembers = [post nodesForXPath:#"//value/struct/member" error:nil];
for(GDataXMLElement *postMember in postMembers){
NSString *key = [[[postMember elementsForName:#"name"] objectAtIndex:0] stringValue];
NSString *value = [[[postMember elementsForName:#"value"] objectAtIndex:0] stringValue];
// ...
}
}
However I'm facing the issue, that postMembers contains ALL members in the XML Document, not just those of one "post".
Am I doing something wrong or is there a way to get around this?
With any XPath query starting with /, you tell the XPath engine to ignore the current context and start at the root instead. Using //value, you're querying for all <value/> elements from the root, no matter what context item you pass.
Using following XPath queries should return the elements you're looking for:
Finding the context. I removed the unnecessary second / in the beginning (which will slow down the evaluation of your query) and added the /struct axis step (I guess you just forget that?).
/methodResponse/params/param/value/array/data
Return all <member/>s for the current context:
value/struct/member
Alternatively you could also explicitly denote using the current context . (which I prefer, as it clearly says what I wanted the XPath expression to do) using
./value/struct/member

Remove &nbsp; from a html string saved in NSString

NSString* test = #"<b> Terms and Conditions</b><br />
- No smoking(by law) <br />
&nbsp; No chewing pan(by law)<br />"
[test stringByReplacingOccurrencesOfString:#"&nbsp;" withString:#"s"];
I tried to remove that "&nbsp;" but it fails to do so? Any ideas??
Thanks
test is an immutable string and you are ignoring the result when you do the replacement. Try this:
test = [test stringByReplacingOccurrencesOfString:#"&nbsp;" withString:#"s"];
This method doesn't change the string to which you send the message, but rather returns a new string.
NSString *newStr = [test stringByReplacingOccurrencesOfString:#"&nbsp;"
withString:#"s"];
I tried to manipulate the string with the following unit test:
- (void) testStringManipulation {
NSString* test = #"<b> Terms and Conditions</b><br /> - No smoking(by law) <br /> &nbsp; No chewing pan(by law)<br />";
NSString* expected = #"<b> Terms and Conditions</b><br /> - No smoking(by law) <br /> s No chewing pan(by law)<br />";
NSString *result = [test stringByReplacingOccurrencesOfString:#"&nbsp;" withString:#"s"];
STAssertTrue([expected isEqualToString:result], #"Should be true");
}
This passes in my IDE.
I'm using OCUnit.
Did you put the [test stringByReplacingOccurrencesOfString... in a new variable?
This method does not mutate the object, but returns a new string instance.
You might just try replacing with &#160 instead and see how that compiles that way.

How to fetch data from the xml using objective c?

I have the xml structure as follows
<xml_api_reply version="1">
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
<forecast_information>
<city data="Chennai, Tamil Nadu"/>
<postal_code data="chennai"/>
<forecast_date data="2011-12-13"/>
<current_date_time data="1970-01-01 00:00:00 +0000"/>
<unit_system data="US"/>
</forecast_information>
<current_conditions>
<condition data="Haze"/>
<temp_f data="84"/>
<temp_c data="29"/>
<humidity data="Humidity: 58%"/>
<icon data="/ig/images/weather/haze.gif"/>
<wind_condition data="Wind: NE at 13 mph"/>
</current_conditions>
</weather >
</xml_api_reply>
How to fetch this data and store it in an array?
Actually you are having the XML which is having Attributes.... Is is also very Easy. You can refer this Link:-
Like
if([elementName isEqualToString:#"city"]) {
NSString *urlValue=[attributeDict valueForKey:#"data"];
}
Hope This Helps You...:))
and if not then tell me i will try to Help you more.
I would suggest to use a framework like KissXML (https://github.com/robbiehanson/KissXML) to do the parsing of the XML for you.
DDXMLDocument *myXmlDoc = [DDXMLDocument alloc] initWithXMLString:myXmlString options:options error:nil];
NSArray *elements = [[myXmlDoc rootElement] elementsWithName:#"forecast_information"];
...
do stuff with the elements
For documentation on KissXML you can read Apple's docs on NSXML, as KissXML is modeled after this

How to cut string from string in iOS?

page=#"<html><body><p>look at me</p><p>right</p></body></html>";
I need "look at me" from this string if I don't know when "look at me" starts and its length
but I know that "look at me" there is after <p> and before </p>
I need new string like that
text=#"look at me";
Do something like this:
NSString* yourResult;
NSScanner *htmlScanner = [NSScanner scannerWithString:yourHtml];
//Video-Start finden
[htmlScanner scanUpToString:#"<p>" intoString:NULL];
[htmlScanner scanString:#"<p>" intoString:NULL];
[htmlScanner scanUpToString:#"</p>" intoString:&yourResult];
This should give you the first string between tags. If you want to extract more than one result, you could loop this, until yourResult stays nil.
Assuming your input string is always well-formed XML (XHTML -- plain HTML isn't) you could process it through an XML processor (XML DOM or an XML Reader). Alternatively you can do it through Regular Expressions, which would work even if your input can be other than well-formed XML.

Scripting Bridge and com.apple.iWork.Pages -- can this work?

I am trying to count the words in Pages document (the doc format is RTF) using the scripting bridge. (I can do it using NSApplescript but I would rather not have all the applescript-aware duct tape in my code)
When I perform this task using applescript (and NSAppleScript APIs) I can do this very simply (and successfully):
on wordCount(appName,docName)
local mydoc
local wordcount
tell application appName
set mydoc to document docName
set wordcount to count of words of mydoc
log "wordcount = " & wordcount
return wordcount
end tell
end wordCount
However when I try the equivalent using the scripting bridge all my objects seem to have null contents. My code is as follows:
+ (NSUInteger) wordCountForApp: (SBApplication*) sbApp docNamed: (NSString*) docName
{
PagesApplication *pages = (PagesApplication*)sbApp;
PagesDocument *doc = [[pages documents] objectWithName:docName];
PagesText *text = [doc bodyText];
SBElementArray *words = [text words];
NSUInteger wc = [words count];
NSLog(#"Pages word count = %ul", (unsigned int) wc);
return wc; // wc comes back as zero always ... grrrr
}
I have verified that I am running this stuff on the main thread (and that equivalent code works against TextEdit). Any ideas as to what is going on/how to work around?
Thanks for having read this far....
That code works for me. The equivalent in F-Script:
> pages := SBApplication applicationWithBundleIdentifier: 'com.apple.iWork.Pages'
> (pages documents objectWithName: 'fun') bodyText words count
303
I'd suggest you step through it with a debugger and make sure that each object is what you're expecting, i.e. pages, [pages documents], etc.
If you're writing this code for external use, ideally you should not refer to documents by name; the user may have multiple documents with the same name open.
Another option is objc-appscript, which provides an neat ASTranslate utility that transforms AppleScript into Objective-C (or Ruby or Python for the other appscript bindings). For example, for the above, you'd have something like:
#import "PGGlue/PGGlue.h"
PGApplication *pages = [PGApplication applicationWithName: #"Pages"];
PGReference *ref = [[pages documents] byName: #"fun"];
PGCountCommand *cmd = [[ref count] each: [PGConstant word]];
id result = [cmd send];
So the problem was that I was asking for a document named "something.rtf" that I had just opened in Pages. But when Pages opens "something.rtf" it names it "something". And then when you ask for document named "something.rtf" it does not return nil because the document does not exist by that name. Instead, it returns a PagesDocument named "something.rtf" which has no valid contents: a NIL document. Which I guess I just was too stupid to recognize when I submitted to SO.
I have since checked other apps and this seems to be normal applescript behavior when you ask for a document by name (to get back a "valid object" containing a NIL document) oh well.