我有XML样本:
<book id="bk101">
<title>XML Developer's Guide</title>
</book>
<book id="bk102">
<title>Midnight Rain</title>
</book>
如何输出ID为“bk101”的图书的标题值?
我的代码:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"book"])
{
NSString *codeValue = [attributeDict objectForKey:@"id"];
if ([codeValue isEqualToString:@"bk101"]) {
//NSLog(@"found"); // output book title here
}
}
}
答案 0 :(得分:3)
假设结构XML(如示例和标记中没有子元素且标记内的文本没有unicode或其他特殊字符。然后输出到控制台(例如)ID为“bk101”的书的“标题”值,你应该:
将codeValue
声明为属性。
@property (strong, nonatomic) NSString *codeValue;
更改您的代码如下:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"book"])
{
_codeValue = [attributeDict objectForKey:@"id"];
}
}
添加如下所示的实施foundCharacters:
方法:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if ([_codeValue isEqualToString:@"bk101"])
{
NSLog(@"found: %@", string); // output book title here
}
}
添加如下所示的实施didEndElement:
方法(有选择地针对并非所有标签“book”都具有属性的情况):
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if (_codeValue != nil)
{
_codeValue = nil
}
}
注意:如果帖子开头指定的条件不同 - 您可能需要不同的实现。
作为替代方案,您可以使用XMLConverter并转换您的XML(我做了一些更改):
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="bk101">
<title>XML Developer's Guide</title>
</book>
<book id="bk102">
<title>Midnight Rain</title>
</book>
</books>
到NSDictionary
,如下所示:
2013-12-24 13:15:48.167 test[603:70b] {
books = {
book = (
{
"-id" = bk101;
title = "XML Developer's Guide";
},
{
"-id" = bk102;
title = "Midnight Rain";
}
);
};
}
并与之合作。