【0】README

0.1)本文文字描述转自 core java volume 2 , 旨在理解 XML——使用 XPath来定位信息+使用命名空间 的基础知识 ;
0.2) for detailed XPath info : please visit ( http://www.ruanyifeng.com/blog/2009/07/xpath_path_expressions.html + http://www.w3schools.com/xsl/xpath_syntax.asp)
0.3) for source code about XPath, please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter2/XPath


【1】XPath 相关

1)problem+solution (干货——XPath引入的原因)

  • 1.1)problem: 如果要定位某个 XML 文档中的一段特定信息, 那么,通过遍历DOM 树的众多节点来进行查找显得有些麻烦;
  • 1.2)solution: XPath 语言使得 访问树节点变得很容易;

2)看个荔枝:有下面的XML文档

<configuration><database><username>dbuser</username><password>dbuser</password>.....</database>
</configuration>
  • 2.1)可以通过 读 XPath 表达式 /configuration/database/username 求值得到 database 中 的username;
  • 2.2)使用 XPath 执行以下操作比普通的DOM 方式要简单得多:
    • 2.2.1)获得文档节点;
    • 2.2.2)枚举它的子元素;
    • 2.2.3)定位 database 元素;
    • 2.2.4)获取 database 元素的第一个子元素, 即 username 元素;
    • 2.2.5)获取 username 元素的第一个子元素, 即 text 节点;
    • 2.2.6)获取 text 节点中的数据;
  • 2.3)XPath 可以描述 XML 文档中的一个节点集: 如 /a/b ;

    • 2.3.1)我们可以用[] 操作符来选择特定元素:/a/b[1];
    • 2.3.2)使用 @ 操作符可以得到属性值, /a/b/c@anchor
  • 2.4)XPath有很多有用的函数: count 函数:count(/a/b), 返回 a根元素的b子元素的数量。

3)Java SE 5 增加了一个API来计算XPath表达式, 需要先从 XPathFactory 创建一个 XPath对象:

XPathFactory xpf = XPathFactory.newInstance();
path = xpf.newXPath();
  • 3.1)然后调用 evaluate 方法来计算 XPath 表达式:

String username = path.evaluate("/a/b/c",doc);

  • 3.2)可以用同样的 XPath 对象来计算多个表达式: 这种形式的 evaluate 返回一个字符串, 这很适合用来获取文本,比如前面 的例子中的 username 节点中的文本;
  • 3.3)如果XPath 表达式产生了一组节点, 请做如下调用:
    NodeList nodes = (NodeList) path.evaluate("/a/b", doc, XpathConstants.NODESET);
  • 3.4)如果结果只有一个节点, 则以 XPathConstants.NODE 代替:
    Node node = (Node) path.evaluate("/a/b[1]", doc, XPathConstants.NODE);
  • 3.5)如果结果是一个数字, 则使用 XPathConstants.NUMBER:
    int count = (Number) path.evaluate("count(/a/b)", doc, XPathConstants.NUMBER.intValue());
  • 3.6)不必从文档的根节点开始搜索, 可以从任意一个节点或节点列表开始。
如果你有前一次计算得到的节点, 那么就可以调用:
result = path.evaluate(expr, node);


【2】使用命名空间

1)java用包来避免名字冲突,XML 也有类似的命名空间机制,可以用于元素名和属性名; (干货——XML的命名空间机制等同于java中的package)

  • 1.1)名字空间:是由统一资源标识符(Uniform Resource Identifier, URI)来标识的;
  • 1.2)HTTP的URL格式是最常用的: 注意 URL 只用作标识符字符串,而不是一个文件的定位符; (干货——HTTP的URL格式是最常用作为命名空间的,仅仅在于标识,而不是定位某个文件) 如, 名字空间标识符:
http:// www.horstman.com/corejava ; http:// www.horstman.com/corejava/index.html;表示了不同的命名空间, 尽管web 服务器为这两个URL 提供相同的文档;

2)人们习惯于将解释该命名空间的文档放在 URL位置上。如,如果你把浏览器指向 XML Schema 的命名空间URL, 你就会发现一个描述XML Schema 标准的文档;

  • 2.1)为什么要用URL 作为命名空间的标识符呢? 这是因为这样容易确保它们是独一无二 的。

3)java中,使用import来指定很长的包名, 然后只需要使用较短类名;

  • 3.1)在XML中,有类似机制, 如 (干货——如何在xml中引入 命名空间)
<element xmlns="namespaceURI">children
</element>
  • 3.2)现在, 该元素和他的子元素都是给定命名空间的一部分了, 子元素可以提供自己的命名空间, 如: (干货——父元素和子元素可以有自己不同的命名空间)
<element xmlns="namespaceURI1"><child xmlns="namespaceURI2">grandchildren</child>
</element>
这样,第一个子元素和孙元素都是第二个命名空间的一部分了;
  • 3.3)你也可以用一个前缀来表示命名空间, 即为特定文档选取的一个短的标识符。下面是一个典型的荔枝: (干货——用一个前缀来表示命名空间)
<xsd: schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd: element name="a" type="GridBagType">
</xsd: schema>
  • 3.4)下面的属性: xmlns :prefix = “namespaceURI” , 用于定义命名空间和前缀。 在我们的例子中, 前缀是xsd。 这样, xsd:schema 实际上指的是 命名空间 http://www.w3.org/2001/XMLSchema 中的schema;

  • Attention)

    • A1) 只有子元素继承了它们父元素的命名空间, 而不带显示前缀的属性不是命名空间的一部分;

4)默认情况下, DOM 解析器并非“命名空间感知的”, 要打开命名空间处理特性:

请调用 DocumentBuilderFactory 类的 setNamespace Aware  方法: factory.setNamespaceAware(true);

(干货——开命名空间处理特性,factory.setNamespaceAware(true))

  • 4.1)这样,工厂产生的所有生成器便都支持命名空间了。每个节点有3个属性(Properties):

    • P1)带有前缀的限定名, 由 getNodeName 和 getTagName 等方法返回;
    • P2)命名空间 URI ,由 getNamespaceURI 方法返回;
    • P3)不带前缀和命名空间的本地名, 由getLocalName 方法返回;

4)看个荔枝:

  • 4.1)下面是一个荔枝, 假设解析器看到了以下元素:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  • 4.2) 它会报告:
限定名 = xsd :schema ;
命名空间 URI = http://www.w3.org/2001/XMLSchema ;
本地名=schema ;
  • Attention) 如果对命名空间的感知特性被关闭, getLocalName 和 getNamespaceURI 方法将返回 null;

XML——使用 XPath来定位信息+使用命名空间相关推荐

  1. 用XPath精确定位节点元素selenium使用Xpath定位之完整篇

    用XPath精确定位节点元素&selenium使用Xpath定位之完整篇 用XPath精确定位节点元素&selenium使用Xpath定位之完整篇 在利用XSL进行转换的过程中,匹配的 ...

  2. python中xpath定位_xpath最新:关于python中的xpath解析定位_爱安网 LoveAn.com

    关于"xpath"的最新内容 聚合阅读 这篇文章主要介绍了关于python中的xpath解析定位,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧... 这篇文章主要 ...

  3. 爬虫系列教程二:如何获取网页信息并定位信息所处位置

    在爬虫中如何获取并定位网页的信息 由于我们获取网页的类型的不同,我们希望爬取的信息的定位方法也有很大差别,但总体来说我们想要爬取的网页可以分为静态和动态,下面讲述在不同的情况下如何爬取这些信息: 网页 ...

  4. android使用高德地图SDK获取定位信息

    注册账号.创建应用.获取API KEY等这些就不说了,按照官网来就行,我们来讲讲项目的配置及示例代码. 高德地图获取定位信息配置要比百度地图简单多了,这是我比较喜欢的一点,而且之前用百度地图嵌入一个应 ...

  5. 执行xpath时提示,需要命名空间管理器或XsltContext。此查询具有前缀、变量或用户定义的函数

    执行xpath时提示,需要命名空间管理器或XsltContext.此查询具有前缀.变量或用户定义的函数 2012-05-05 10:45:48|  分类: 默认分类 |  标签:要命名空间管理器  x ...

  6. web自动化测试(一) 介绍 及 Xpath,Css 定位元素

    1.1什么是自动化测试 自动化测试的概念: 软件自动化测试就是通过测试工具或者其他手段, 按照测试人员的预定计划对软件产品进行自动化 测试,他是软件测试的一个重要组成部分,能够 完成许多手工测试无法完 ...

  7. Android 天气APP(二)获取定位信息

    上一篇:Android 天气APP(一)开发准备 编码阶段 新版------------------- 一.使用ViewBinding 二.初始化SDK 三.初始化定位 四.检查和请求权限 五.文章源 ...

  8. java编程手机gps定位_GPS 获取Gps定位信息的Android源码实例,通过这个JAVA 目,你可能学会GPS在 手机 238万源代码下载- www.pudn.com...

    文件名称: GPS下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 59 KB 上传时间: 2013-04-08 下载次数: 22 详细说明:获取Gps定位信息的A ...

  9. Android使用百度地图api获取定位信息(经纬度)

    文章目录 注册 申请密钥 配置 使用 遇到问题 注册 登录百度地图开放平台 注册百度地图开发者,填写相关信息 提交成功后收到邮件 点击链接弹出如下提示就算激活成功了 申请密钥 点击申请密钥或者创建应用 ...

最新文章

  1. vs + ffmpeg------待续
  2. java 验证码图片识别_JavaSE图像验证码简单识别程序详解
  3. BZOJ 1114 Number theory(莫比乌斯反演+预处理)
  4. 一道经典的JavaScript面试题
  5. 全面理解python中self的用法
  6. UML之用例图(use case)箭头方向
  7. 从包中导入类的使用 java
  8. 使用ObjectDataSource 显示数据
  9. nasa电池数据集_文章分享—模型与滤波算法结合的锂电池剩余寿命预测方法
  10. ionic4 ios打开appstore 跳转第三方app
  11. Redis 在 MySql 中的优化历程
  12. 全方位解析阿里云核心技术竞争力,CSDN 独家在线峰会来了!
  13. 防控疫情,我们在行动——爱奇艺战“疫”全纪录
  14. 2015湖南省选集训DAY5——work(BZOJ4177)
  15. hdoj--5621--KK's Point(简单数学)
  16. vscode - 设置 Python 版本
  17. MySQL安装教程包含所有平台(图解),MySQL下载步骤详解(带安装教程)
  18. 华顺信安 白帽汇安全研究院一面复盘
  19. Xcode 打包动态及静态Framework
  20. android记账本折线图_Android Studio——记账本以及图表可视化实现

热门文章

  1. Strange Partition CodeForces - 1471A
  2. 【无码专区5】01串(大讨论+构造)
  3. YBTOJ:魔法数字(数位dp)
  4. bfs:01迷宫(洛谷P1141)
  5. P3335-[ZJOI2013]蚂蚁寻路【dp】
  6. ssl1197-质数和分解【dp练习】
  7. 【数论】【杜教筛】选数(P3172)
  8. [USACO]Sprinklers 2: Return of the Alfalfa P(网格DP)
  9. 动态规划训练11 [String painter HDU - 2476]
  10. SpringCloud Zuul(七)之POST Filter