2012-01-02 63 views
3

我们如何才能在NSXmlparser中处理自闭标签?没有 开始元素和结束元素 - 是否可以处理以下类型的标签?在NSXmlParser中处理自闭标签?

<ITEM NAME/> 
<REG Number/> 
+0

使用TbXml解析在这你很容易得到这一个 – Ron 2012-01-02 04:19:17

回答

5

任何XML解析器,包括的NSXMLParser,要治疗这种:

<ITEMNAME/> 

相同此XML:

<ITEMNAME></ITEMNAME> 

换句话说,只要解析器代码编写关心的是,你应该看到解析器调用的元素回调的开始和结束。为了证明这一点,我把下面的示例XML文件中的:

<top> 
    <sample1/> 
    <sample2 attr1="a"/> 
</top> 

我然后执行以下代码加载该文件,并对其进行分析:

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"xml"]; 
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:sampleURL]; 
[parser setDelegate:self]; 
[parser parse]; 

我的解析器委托方法被实现为如下:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    NSLog(@"Received didStartElement callback for tag: %@", elementName); 
} 


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    NSLog(@"Received didEndElement callback for tag: %@", elementName); 
} 

当我运行这段代码,我看到下面的控制台输出:

2012-01-01 22:24:24.011 SampleXML[10248:707] Received didStartElement callback for tag: top 
2012-01-01 22:24:24.012 SampleXML[10248:707] Received didStartElement callback for tag: sample1 
2012-01-01 22:24:24.013 SampleXML[10248:707] Received didEndElement callback for tag: sample1 
2012-01-01 22:24:24.013 SampleXML[10248:707] Received didStartElement callback for tag: sample2 
2012-01-01 22:24:24.015 SampleXML[10248:707] Received didEndElement callback for tag: sample2 
2012-01-01 22:24:24.015 SampleXML[10248:707] Received didEndElement callback for tag: top 

正如你所看到的,我为sample1和sample2标签都得到了didStartElement和didEndElement回调,这就是它应该如何工作的。

+0

parserdidstart和parserdidend元素deleagate方法将被调用为通常?我检查过,它不叫.. – nameless 2012-01-02 04:01:54

+0

你确定吗?我还没有尝试过,但它似乎只有'parser:didEndElement:namespaceURI:qualifiedName:'将被调用,因为''是一个结束标记,对吧? – 2012-01-02 04:05:02

+0

我相信它是XML 1.0规范的一部分,就任何解析器而言,它们是相同事物的替代形式。我会看看我能否证实这一点。我知道,如果元素具有任何属性,则必须确保didStartElement被调用。如果不被称为不管是什么,我都会感到惊讶,但是这需要我来验证一下。 – 2012-01-02 04:09:20

0

这是结束标记,它将调用NSXMLParser委托人的didEndElement

该标记的发现字符将为空。

无需任何特殊的逻辑来处理this.v

+0

是正确的,不需要任何特殊的逻辑来处理这个问题。说出找到的人物是空的可能并不完全准确。当使用XML这样的“空元素”语法时,NSXMLParserDelegate的foundCharacters回调将永远不会被调用。另外,说“这是结束标记”并不准确 - 这是特殊的XML语法,它既是开始标记又是结束标记的缩写。 – 2012-01-02 04:40:37

0

我不得不做出一个XML解析器和我的标签之一是空的,自我封闭,即

开始和endElement正在..