#iphone #objective-c #xml #nsxmlparser #asx
#iPhone #objective-c #xml #nsxmlparser #asx
Вопрос:
Я совершенно новичок в XML.
Есть ли у кого-нибудь пример кода, который помог бы мне создать пользовательский класс, который анализировал бы файлы Microsoft .asx для последовательного воспроизведения потоков mms на iPhone?
После некоторого поиска в Google я обнаружил, что .xml и .asx в некоторой степени связаны, хотя второй вариант очень ограничен по сравнению с первым.
Мне нужно последовательно воспроизвести три потока внутри контейнера .asx, подобного этому:
<asx version="3.0">
<TITLE>MYSONGS</TITLE>
<entry>
<TITLE>www.mysite.com</TITLE>
<ref href="mms://mysite.com/musicFolder/song1.wma" />
</entry>
<entry>
<TITLE>MYSONGS</TITLE>
<ref href="mms://mysite.com/musicFolder/song2.wma" />
</entry>
<entry>
<TITLE>www.mysite.com</TITLE>
<ref href="mms://mysite.com/musicFolder/song3.wma" />
</entry>
</asx>
Я уже могу анализировать поток mms, декодировать и воспроизводить файл wma. Я просто пока не могу проанализировать содержимое .asx, чтобы последовательно воспроизводить потоки. Спасибо!
Ответ №1:
В моем случае я смог успешно проанализировать файлы .asx с помощью TouchXML, используя этот код (который я изменил по сравнению с оригинальной версией, доступной на http://foobarpig.com/iphone/parsing-xml-element-attributes-with-touchxml.html):
// we will put parsed data in an a array
NSMutableArray *res = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString: @"http://www.yoursite.com/WindowsMediaDotCom/theFileToParse.asx"];
/* have TouchXML parse it into a CXMLDocument */
CXMLDocument *document = [[[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil] autorelease];
NSArray *nodes = NULL;
// searching for piglet nodes
nodes = [document nodesForXPath:@"//ref" error:nil];
for (CXMLElement *node in nodes) {
NSMutableDictionary *item = [[NSMutableDictionary alloc] init];
int counter;
for(counter = 0; counter < [node childCount]; counter ) {
// common procedure: dictionary with keys/values from XML node
[item setObject:[[node childAtIndex:counter] stringValue] forKey:[[node childAtIndex:counter] name]];
}
// and here it is - attributeForName! Simple as that.
[item setObject:[[node attributeForName:@"href"] stringValue] forKey:@"href"]; // <------ this magical arrow is pointing to the area of interest
[res addObject:item];
[item release];
}
// and we print our results
NSLog(@"%@", res);