在Cocoa中解析NSXMLNode属性

时间:2010-06-02 22:16:27

标签: objective-c xml cocoa

给出以下XML文件:

    <?xml version="1.0" encoding="UTF-8"?>
<application name="foo">
 <movie name="tc" english="tce.swf" chinese="tcc.swf" a="1" b="10" c="20" />
 <movie name="tl" english="tle.swf" chinese="tlc.swf" d="30" e="40" f="50" />
</application>

如何访问MOVIE节点的属性(“英语”,“中文”,“名称”,“a”,“b”等)及其相关值?我目前在Cocoa中有遍历这些节点的能力,但我对如何访问MOVIE NSXMLNodes中的数据感到茫然。

有没有办法可以将每个NSXMLNode中的所有值转储到Hashtable中并以这种方式检索值?

使用NSXMLDocument和NSXMLNodes。

2 个答案:

答案 0 :(得分:12)

YES!我不知何故回答了自己的问题。

在迭代XML文档时,不是将每个子节点指定为NSXMLNode,而是将其指定为NSXMLElement。然后,您可以使用attributeForName函数返回一个NSXMLNode,您可以使用stringValue来获取属性的值。

由于我不善于解释事情,这是我的评论代码。它可能更有意义。

//make sure that the XML doc is valid
if (xmlDoc != nil) {
            //get all of the children from the root node into an array
            NSArray *children = [[xmlDoc rootElement] children];
            int i, count = [children count];

            //loop through each child
            for (i=0; i < count; i++) {
                NSXMLElement *child = [children objectAtIndex:i];

                    //check to see if the child node is of 'movie' type
                    if ([child.name isEqual:@"movie"]) {
                    {
                        NSXMLNode *movieName = [child attributeForName:@"name"];
                        NSString *movieValue = [movieName stringValue];

                        //verify that the value of 'name' attribute of the node equals the value we're looking for, which is 'tc'
                        if ([movieValue isEqual:@"tc"]) {
                        //do stuff here if name's value for the movie tag is tc.
                        }
                    }
            }   
   }

答案 1 :(得分:9)

有两种选择。如果您继续使用NSXMLDocment且电影元素的NSXMLNode *,则可以执行以下操作:

if ([movieNode kind] == NSXMLElementKind)
{
    NSXMLElement *movieElement = (NSXMLElement *) movieNode;
    NSArray *attributes = [movieElement attributes];

    for (NSXMLNode *attribute in attributes)
    {
        NSLog (@"%@ = %@", [attribute name], [attribute stringValue]);
    }
}

否则,您可以切换为使用NSXMLParser。这是一个事件驱动的解析器,它在解析了元素(以及其他内容)时通知委托。您所追求的方法是parser:didStartElement:namespaceURI:qualifiedName:attributes:

- (void) loadXMLFile
{
    NSXMLParser *parser = [NSXMLParser parserWithContentsOfURL:@"file:///Users/jkem/test.xml"];
    [parser setDelegate:self];
    [parser parse];
}


// ... later ...

-      (void)         parser:(NSXMLParser *)parser
             didStartElement:(NSString *)elementName
                namespaceURI:(NSString *)namespaceURI
               qualifiedName:(NSString *)qualifiedName
                  attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"movie"])
    {
        NSLog (@"%@", [attributeDict objectForKey:@"a"]);
        NSLog (@"%d", [[attributeDict objectForKey:@"b"] intValue]);
    }
}