我正在开发一个 iPhone 项目,需要解析一些 xml。 xml 可能包含也可能不包含默认名称空间。我需要知道如何解析 xml,以防它使用默认命名空间。由于我需要读取和写入 xml,因此我倾向于使用 KissXML,但我愿意接受建议。
这是我的代码:
NSString *content = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:@"bookstore" ofType:@"xml"] encoding:NSUTF8StringEncoding error:nil];
DDXMLDocument *theDocument = [[DDXMLDocument alloc] initWithXMLString:content options:0 error:nil];
NSArray *results = [theDocument nodesForXPath:@"//book" error:nil];
NSLog(@"%d", [results count]);
它在此 xml 上按预期工作:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
</book>
</bookstore>
但是当 xml 有一个命名空间时,像这样,它就会停止工作:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore xmlns="[INSERT RANDOM NAMESPACE]">
<book category="COOKING">
<title lang="en">Everyday Italian</title>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
</book>
</bookstore>
当然,我可以只预处理字符串并删除 xmlns,尽管这感觉像是一种丑陋的黑客行为。处理这个问题的正确方法是什么?
干净的方法:查询命名空间
您可以使用两个 XPath 查询,一个用于获取名称空间,然后注册它;另一个用于获取名称空间,然后注册它。作为第二个查询,请使用您已有的查询,包括名称空间。我只能帮助您进行查询,但看来您对命名空间以及如何在 KissXML 框架中注册它们非常熟悉:
namespace-uri(/*)
此表达式获取从文档根开始的所有子节点(根据 XML 定义,这是一个根元素),并返回其命名空间 uri。
丑陋的方式:仅测试本地名称
KissXML 似乎只支持 XPath 1.0。对于这种能力较差的语言版本,您需要在每个轴步骤中使用通配符选择器,并比较谓词内的本地名称(没有命名空间前缀):
//*[local-name(.) = 'book']
从 XPath 2.0 开始,您可以使用命名空间通配符进行查询,它要短得多:
//*:book
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)