使用Objective C - 我想循环遍历XML树,并在与特定元素名称匹配的特定节点的每个实例上显示完整的XML内容。
作为示例 - 我希望在元素b的每个实例中获取XML(表示为NSString)。如果元素b中只有一个字符串,我可以得到值,但是如何获得格式化为XML的NSString表示,包括所有元素名称?
<element a>
<element b>
<element c>
some text 1
</element c>
</element b>
<element b>
<element c>
some text 2
</element c>
</element b>
<element b>
<element c>
some text 3
</element c>
</element b>
</element a>
答案 0 :(得分:1)
您可以使用NSXMLParser执行此操作。类(1)的三个主要部分检查开始标记:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict;
(2)抓住遇到的节点内的内容:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
和(3)在节点完成时将数据存储到您选择的适当位置:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
Apple有一个很好的指南,涵盖NSXMLParser here
答案 1 :(得分:0)
我可以想到三种方法,所有方法都有利有弊。
解析为字符串。根据您要提取的内容,您可以使用字符串操作代码来搜索和提取所需的位。这会忽略xml结构并将问题简化为简单的字符串处理方法。但可能不够聪明,具体取决于你想要的xml和节点。
编写NSXMLParser代码,将xml字符串解析为某种数据结构(即DOM),找到所需的节点,然后让它们生成xml。再取决于你想要什么,这可能太重了。 COuld也意味着更多的编码。
下载图书馆,为您完成肮脏的工作。周围有各种各样的,我有一个(在这里无耻的自我推销)http://github.com/drekka/dXml这可能有所帮助。它当然可以将xml解析为DOM,就像数据结构一样,您可以使用类似XPath的查询来查找节点并转换回字符串。这样做的缺点是你现在正在使用第三方库。
答案 2 :(得分:0)
我昨晚有一个脑波,这是我提出的解决方案......看起来有点不雅,但它确实有效。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if ([elementName isEqualToString:@"element b"])
{
area = [[NSMutableString alloc] init];
current_element = [elementName copy];
}
else if ([current_element isEqualToString:@"element b"])
{
NSString *tag = [NSString stringWithFormat:@"<%@>", elementName];
[area appendString:tag];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"element b"])
{
NSLog(@"tag info: %@", area);
}
else if ([current_element isEqualToString:@"element b"])
{
NSString *tag = [NSString stringWithFormat:@"</%@>", elementName];
[area appendString:tag];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
if ([current_element isEqualToString:@"element b"]) {
[area appendString:string];
}
}