KissXML的XPath选取问题
XMPPFramework用的XML解析库还是大神自己写的KissXML,有些人生下来就是让人仰望的,哎。
进入主题,如下一段XML:
<paramsxmlns="namespace"><paramname="text">text in element</param><paramname="voice">voice in element</param></params>
需要得到各个<param/>子元素中的键值对应关系text->text in element和voice->voice in element。最简单的方法就是用XPath选取指定的元素。
KissXML的NSXMLElement类的父类NSXMLNode有一个通过XPath选取子元素得到数组的方法:
-(NSArray*)nodesForXPath:(NSString*)xpath error:(NSError**)error;
试之,竟然返回为空。。搜之,发现KissXML上已经有人开了issue,还有热心人把代码都补上了,这个世界上还是好人多啊。
前面的方法不能是因为<params/>中设置了namespace,需要为元素注册这个namespace,所以修改后的方法为:
-(NSArray*)nodesForXPath:(NSString*)xpath namespaceMappings:(NSDictionary*)namespaceMappings error:(NSError**)error
第一步: 在namespaceMappings中设置一个命名空间的别名,如这样的:@{@"prefix":@"namespace"} ;
第二步: 在XPath中使用别名 //prefix:param
NSString*xmlstring =@"<params xmlns=\"namespace\" >"@"<param name=\"text\">text in element</param>"@"<param name=\"voice\">voice in element</param>"@"</params>";NSXMLElement*element =[[NSXMLElement alloc] initWithXMLString:xmlstring error:nil];NSDictionary*namespaceMap=@{@"prefix":@"namespace"};NSArray*subelements =[element nodesForXPath:@"//prefix:param" namespaceMappings:namespaceMap error:nil];for(NSXMLElement*e in subelements){NSLog(@"sublelement: %@",[e XMLString]);}
这样就可以选到<param/>子元素了。
2013-08-0117:35:04.624ChatModule[14387:c07] sublelement:<param name="text">text in element</param>2013-08-01 17:35:04.625 ChatModule[14387:c07] sublelement: <param name="voice">voice in element</param>
进一步的,如果想要选择name是text的<param/>元素,可以使用更精确的XPath: //prefix:param[@name='text']。
关于为什么要注册namespace,还需要读libxml2的代码,后面抽时间看一下,改动后的代码中加了这么一段:
if(namespaceMappings){for(NSString* k in namespaceMappings){NSString* v =[namespaceMappings objectForKey:k];xmlXPathRegisterNs(xpathCtx,[k xmlChar],[v xmlChar]);}}
看SO上有人直接用libxml2的时候也有这个问题,xpath-query-for-a-node 。
关于XPath的语法,戳这里 .
完。
KissXML的XPath选取问题的更多相关文章
- xpath 选取指定文本内容可能是多种情况下的语法
url_list = select.xpath("//ul/li/a[contains(text(),'新闻中心' )]/../../li/a/@href | //ul/li/a[conta ...
- ios中XPath的语法
在XML的读写中,我们知道有Xpath的语法 1.定位节点:(/)代表绝对的路径,代表起始地位置.(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来 2.KissX ...
- 爬虫 2 XPath 和 pyquery
XPath 1.常用规则 表达式 描述 nodename 选取此节点的所有子节点 / 从当前节点选取直接子节点 // 从当前节点选取子孙节点 . 选取当前节点 .. 选取当前节点的父节点 @ 选 ...
- [XPath] XPath 与 lxml (二)XPath 语法
XPath 选取节点时使用的表达式是一种路径表达式.节点是通过路径(path)或者步(steps)来选取的. 本章使用以下 XML 文档作为示例. <?xml version="1.0 ...
- 页面元素定位 XPath 简介
页面元素定位 XPath 简介 本文所说的 Xpath 是用于 Selenium 自动化测试所使用到的,是针对XHTML网页而言的一种页面元素的定位表示法. XPath 背景 XPath即为XML路径 ...
- Python3爬虫(五)解析库的使用之XPath
Infi-chu: http://www.cnblogs.com/Infi-chu/ XPath: 全称是 XML Path Language,XML路径语言,它是一门在XML文档中和HTML文档中查 ...
- python爬虫三大解析库之XPath解析库通俗易懂详讲
目录 使用XPath解析库 @(这里写自定义目录标题) 使用XPath解析库 1.简介 XPath(全称XML Path Languang),即XML路径语言,是一种在XML文档中查找信息的语言. ...
- 解析库--XPath
from lxml import etree 2 text = ''' 3 <div> 4 <ul> 5 <li class = "item-0"&g ...
- BizTalk开发系列(十六) XML命名空间
BizTalk开发过程中如果有对XML进行开发操作,比如在自定义代码里操作XML消息或者在Mapping的时候使用Xpath对XML进行操 作.则有机会遇到XML命名空间的问题.常见的是使用Xpath ...
随机推荐
- 零基础配置Linux服务器环境
详细步骤请走官方通道 over!over!over!
- jade安装及基本语法使用
一.cmd安装jade: cnpm install -g jade //cnom install jade -g与上面使用效果一致. 二.jade命令行中使用: 使用cmd: jade index.j ...
- [Xcode 实际操作]二、视图与手势-(7)UIView视图的渐变填充
目录:[Swift]Xcode实际操作 本文将演示创建一个具有渐变填充色的图形 import UIKit class ViewController: UIViewController { overri ...
- [Xcode 实际操作]九、实用进阶-(19)重写父类的绘图方法,使用图形上下文绘制自定义图形
目录:[Swift]Xcode实际操作 本文将演示如何使用图形上下文,绘制自定义图形. 使用快捷键[Command]+[N]创建一个新的类文件. (在项目文件夹[DemoApp]上点击鼠标右键[New ...
- SpringBoot 2.0 整合sharding-jdbc中间件,实现数据分库分表
一.水平分割 1.水平分库 1).概念: 以字段为依据,按照一定策略,将一个库中的数据拆分到多个库中. 2).结果 每个库的结构都一样:数据都不一样: 所有库的并集是全量数据: 2.水平分表 1).概 ...
- Zynq7000开发系列-1(Vivado HLx 2016.4下载及安装)
一.下载 1.访问Xilinx官方网站:www.xilinx.com,注册帐号并完善个人信息 2.点击以下选项进入下载页面:Support -> Downloads & Licensin ...
- [软件工程基础]2017.10.31 第四次 Scrum 会议
具体事项 项目交接燃尽图 每人工作内容 成员 已完成的工作 计划完成的工作 工作中遇到的困难 游心 #7 掌握 PHP:#6 阅读分析 PhyLab 数据处理相关代码 #10 搭建可用的开发测试环境: ...
- 执行脚本 提示 command not found
问题现象: 初学shell,写了个脚本, 1.从windows 写好 脚本,然后部署到 linux 上. 2.chmod +x之后执行提示command not found,系统环境redhat9,用 ...
- Enum 枚举类
目录 Enum 枚举类 基础 定义与用途 基本方法 示例 进阶 实现原理 枚举与Class对象 自定义枚举类和构造方法及toString() Enum中使用抽象方法来实现枚举实例的多态性 Enum与接 ...
- Navicate Premium连接Oracle数据库报错
Navicat Premium连接MySQL数据库没有问题,在连接Oracle数据库的时候报错,提示:ORA-28547:connection to server failed,probable Or ...