【问题标题】:How to handle a tags inside another tags in NSXMLParser如何在 NSXMLParser 中处理另一个标签内的标签
【发布时间】:2012-06-17 12:14:28
【问题描述】:

我有一个文件:

<xml>
    <component>something
        <system>somethingDeeper
            <value>somethingDeepest</value>
        </system>
    </component>

    <component>somethinfDifferent
        <value>somethingDifferentDeeper</value>
    </component>

    <value>somethingNew</value>
</xml>

所以我想区分另一个标签中的内容(例如&lt;system&gt;),什么不是。如何用 NSXMLParser 做到这一点?我目前使用 BOOL ivar,但这是很多标签,这并不像我想要的那样优雅。我知道 NSXMLParser 是一个 SAX 解析器,我明白这一点。

在上面的例子中,我将进入didEndElement 方法三次: elementName 等于 value 有没有更优雅的方法来区分哪些条目是来自&lt;component&gt; 标签上面的不是什么?

【问题讨论】:

    标签: objective-c ios nsxmlparser


    【解决方案1】:

    您可以保留当前所在的标签名称数组

    NSMutableArray *tagNameStack;
    

    每次输入新元素时,都会将其添加到此数组中。每次你离开你再次删除它。即

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
        [tagNameStack addObject:elementName];
    
        // Your code here
    }
    

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
        // Your code here
    
        [tagNameStack removeLastObject];
    }
    

    因此,当您解析 somethingDeepest 时,您的 tagNameStack 数组将是

    @"xml", @"component", @"system", @"value"
    

    您可以使用此堆栈来决定您在 xml 中的位置,即

    - (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    
        if ([tagNameStack containsObject:@"system"]) {
            // Deal with the value inside the system tag
        } else if ([tagNameStack containsObject:@"component"]) {
            // Deal with the value inside the component tag
        } else {
            // This must be the value inside the XML tag
        }
    }
    

    【讨论】:

    • 这部分有用,但据我所知,就我而言,我有一个堆栈,因为所有内容都在 标签内。那么我如何确定结束标签在哪里? Value tak 是最后一个,但我不知道。另一个问题是 if ([tagNameStack containsObject:@"system"]) 与我正在调用的系统有关吗?我无法判断。
    • 每个 XML 文档只有一个栈,永远只能有一个根节点!每次输入&lt;value&gt; 标记时,您都可以通过componentsystem 或只是xml 询问堆栈,这只是查看数组中的项目。
    • 查看我编辑的答案 - 我试图让我的 didEndElement 方法更清晰,以便您可以看到堆栈如何用于检测您正在结束的 &lt;value&gt; 标记。
    • 哦,我修改了您的答案,在 didStartElement 中创建了一个对象,将其放入堆栈,然后在 didEndElement 中删除。你的回答是一个巨大的线索。谢谢。赏金是你的 :)(我还要再等 18 个小时)。
    • @Greeso - 您的编辑有一个错误 - parser:foundCharacters: 可以在解析元素期间多次调用(即,如果它是一大块文本),或者它可能根本不会被调用(即如果元素为空&lt;empty&gt;&lt;/empty&gt;)。令人讨厌的是,您的编辑已经获得批准,您可以随时将其更改回来(或添加评论警告人们这可能会发生!)
    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 2020-03-04
    • 2019-06-28
    • 1970-01-01
    • 2017-09-24
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多