XMPPFramework用的XML解析库还是大神自己写的KissXML,有些人生下来就是让人仰望的,哎。

进入主题,如下一段XML:

  1. <paramsxmlns="namespace">
  2. <paramname="text">text in element</param>
  3. <paramname="voice">voice in element</param>
  4. </params>

需要得到各个<param/>子元素中的键值对应关系text->text in elementvoice->voice in element。最简单的方法就是用XPath选取指定的元素。

KissXML的NSXMLElement类的父类NSXMLNode有一个通过XPath选取子元素得到数组的方法:

  1. -(NSArray*)nodesForXPath:(NSString*)xpath error:(NSError**)error;

试之,竟然返回为空。。搜之,发现KissXML上已经有人开了issue,还有热心人把代码都补上了,这个世界上还是好人多啊。

前面的方法不能是因为<params/>中设置了namespace,需要为元素注册这个namespace,所以修改后的方法为:

  1. -(NSArray*)nodesForXPath:(NSString*)xpath namespaceMappings:(NSDictionary*)namespaceMappings error:(NSError**)error

第一步: 在namespaceMappings中设置一个命名空间的别名,如这样的:@{@"prefix":@"namespace"} ;

第二步: 在XPath中使用别名 //prefix:param

  1. NSString*xmlstring =@"<params xmlns=\"namespace\" >"
  2. @"<param name=\"text\">text in element</param>"
  3. @"<param name=\"voice\">voice in element</param>"
  4. @"</params>";
  5. NSXMLElement*element =[[NSXMLElement alloc] initWithXMLString:xmlstring error:nil];
  6. NSDictionary*namespaceMap=@{@"prefix":@"namespace"};
  7. NSArray*subelements =[element nodesForXPath:@"//prefix:param" namespaceMappings:namespaceMap error:nil];
  8. for(NSXMLElement*e in subelements){
  9. NSLog(@"sublelement: %@",[e XMLString]);
  10. }

这样就可以选到<param/>子元素了。

  1. 2013-08-0117:35:04.624ChatModule[14387:c07] sublelement:<param name="text">text in element</param>
  2. 2013-08-01 17:35:04.625 ChatModule[14387:c07] sublelement: <param name="voice">voice in element</param>

进一步的,如果想要选择nametext<param/>元素,可以使用更精确的XPath: //prefix:param[@name='text']

关于为什么要注册namespace,还需要读libxml2的代码,后面抽时间看一下,改动后的代码中加了这么一段:

  1. if(namespaceMappings){
  2. for(NSString* k in namespaceMappings){
  3. NSString* v =[namespaceMappings objectForKey:k];
  4. xmlXPathRegisterNs(xpathCtx,[k xmlChar],[v xmlChar]);
  5. }
  6. }

看SO上有人直接用libxml2的时候也有这个问题,xpath-query-for-a-node

关于XPath的语法,戳这里 .

完。

KissXML的XPath选取问题的更多相关文章

  1. xpath 选取指定文本内容可能是多种情况下的语法

    url_list = select.xpath("//ul/li/a[contains(text(),'新闻中心' )]/../../li/a/@href | //ul/li/a[conta ...

  2. ios中XPath的语法

    在XML的读写中,我们知道有Xpath的语法 1.定位节点:(/)代表绝对的路径,代表起始地位置.(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来 2.KissX ...

  3. 爬虫 2 XPath 和 pyquery

    XPath 1.常用规则    表达式 描述 nodename 选取此节点的所有子节点 / 从当前节点选取直接子节点 // 从当前节点选取子孙节点 . 选取当前节点 .. 选取当前节点的父节点 @ 选 ...

  4. [XPath] XPath 与 lxml (二)XPath 语法

    XPath 选取节点时使用的表达式是一种路径表达式.节点是通过路径(path)或者步(steps)来选取的. 本章使用以下 XML 文档作为示例. <?xml version="1.0 ...

  5. 页面元素定位 XPath 简介

    页面元素定位 XPath 简介 本文所说的 Xpath 是用于 Selenium 自动化测试所使用到的,是针对XHTML网页而言的一种页面元素的定位表示法. XPath 背景 XPath即为XML路径 ...

  6. Python3爬虫(五)解析库的使用之XPath

    Infi-chu: http://www.cnblogs.com/Infi-chu/ XPath: 全称是 XML Path Language,XML路径语言,它是一门在XML文档中和HTML文档中查 ...

  7. python爬虫三大解析库之XPath解析库通俗易懂详讲

    目录 使用XPath解析库 @(这里写自定义目录标题) 使用XPath解析库 1.简介   XPath(全称XML Path Languang),即XML路径语言,是一种在XML文档中查找信息的语言. ...

  8. 解析库--XPath

    from lxml import etree 2 text = ''' 3 <div> 4 <ul> 5 <li class = "item-0"&g ...

  9. BizTalk开发系列(十六) XML命名空间

    BizTalk开发过程中如果有对XML进行开发操作,比如在自定义代码里操作XML消息或者在Mapping的时候使用Xpath对XML进行操 作.则有机会遇到XML命名空间的问题.常见的是使用Xpath ...

随机推荐

  1. java.endorsed.dirs

    java.ext.dirs 用于扩展jdk的系统库,那么 -Djava.endorsed.dirs 又有什么神奇的作用呢? java提供了endorsed技术: 关于endorsed:可以的简单理解为 ...

  2. java 多线程,sleep()和wait()

    java 线程可谓是java中重要的一个机制,在说线程之前需要知道什么是进程,进程和线程的关系是是什麽? 1.什么是进程?什么是线程? 进程:用句简单的粗俗的来说,进程就是程序.进程是一个正在运行的程 ...

  3. 洛谷 - P3377 - 【模板】左偏树(可并堆) - 左偏树 - 并查集

    https://www.luogu.org/problemnew/show/P3377 左偏树+并查集 左偏树维护两个可合并的堆,并查集维护两个堆元素合并后可以找到正确的树根. 关键点在于删除一个堆的 ...

  4. Android studio改包名

    http://www.cnblogs.com/Kyouhui/p/4632813.html Android Studio,咱们开发安卓的利器,自推出就受到移动开发者的追捧,但一路走来,大家谈到他,充满 ...

  5. 洛谷P3338 [ZJOI2014]力(FFT)

    传送门 题目要求$$E_i=\frac{F_i}{q_i}=\sum_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^n\frac{q_j}{(j-i)^2}$ ...

  6. Web前端篇:CSS常用格式化排版、盒模型、浮动、定位、背景边框属性

    目录 Web前端篇:CSS常用格式化排版.盒模型.浮动.定位.背景边框属性 1.常用格式化排版 2.CSS盒模型 3.浮动 4.定位 5.背景属性和边框属性 6.网页中规范和错误问题 7.显示方式 W ...

  7. EasyUI Datagrid换页不清出勾选方法

    在1.4版本后: 只要在datagrid中加入   idField:'id',给每条数据id属性,easyui就默认就会保留之前勾选的信息 如果没有id,才会出现换页后,之前勾选的信息没有的情况

  8. 详解JS作用域(一)

    一.什么是作用域 存储和访问变量,是任何一种编程语言最基本的功能之一,变量存在哪里?程序需要时如何找到它?这些问题需要一套良好的规则来规范,这套规则,就成为作用域. 二.编译原理 js通常归类为解释语 ...

  9. PHP知识点总结4

    file1.php <?php namespace Foo\Bar\subnamespace; const FOO = 1; function foo() {} class foo { stat ...

  10. 单线程单元(STA)线程都应使用泵式等待基元

    CLR 无法从 COM 上下文 0x20ad98 转换为 COM 上下文 0x20af08,这种状态已持续 60 秒.拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows ...