XML——使用 XPath来定位信息+使用命名空间

【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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机教室英语怎么读音,网络教室,network classroom,音标,读音,翻译,英文例句,英语词典...

多媒体教室1.多媒体教室基本组成多媒体教室由多媒体计算机、液晶投影机、数字视频展示台、中央控制系统、投影屏幕、音响设备等多种现代教学设备组成。(1)多媒体液晶投影机是整个多媒体演示教室中最重要的也是最昂贵的设备&#xff0c;它连接着计算机系统、所有视频输出系统及数…

算法一之简单选择排序

一、 选择排序的思想 选择排序的基本思想是&#xff1a;每一趟在n-i1&#xff08;i1&#xff0c;2&#xff0c;…n-1&#xff09;个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。简单选择排序的基本思想&a…

XML——流机制解析器

【0】README 0.1&#xff09; 本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——流机制解析器 的基础知识 &#xff1b; 0.2&#xff09; for detailed StAX, please visit http://blog.csdn.net/pacosonswjtu/article/details/50569728 【1】XML——流机制…

第512章 河系量子计算机,第512章、河系量子计算机

69中文网 www.69zww.cc&#xff0c;最快更新分身投胎万界最新章节&#xff01;但AI智能所容身的量子计算机就大得有些恐怖了。其总体积丝毫不亚于一个小型河系&#xff01;什么是河系&#xff1f;银河系&#xff0c;仙女星系等等都是大小不等的河系&#xff01;而AI智能容身的量…

idea内置junit5_JUnit 5和Selenium –使用Selenium内置的`PageFactory`实现页面对象模式

idea内置junit5Selenium是一组支持浏览器自动化的工具和库&#xff0c;主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver&#xff0c;它提供客户端库&#xff0c;JSON有线协议&#xff08;与浏览器驱动程序进行通信的协议&#xff09;和浏览器驱动程序。 Sel…

算法二之树形选择排序

一、树形选择排序的基本思想 &#xff08;1&#xff09; 树形选择排序又称锦标赛排序&#xff08;Tournament Sort&#xff09;&#xff0c;是一种按照锦标赛的思想进行选择排序的方法。首先对n个记录的关键字进行两两比较&#xff0c;然后在n/2个较小者之间再进行两两比较&am…

计算机声卡型号价格,怎么查看电脑的声卡型号?查看声卡型号方法介绍

声卡是电脑上的硬件设施&#xff0c;任何电脑上的硬件都需要使用驱动使其运行&#xff0c;那么我们下载驱动的时候就会用到声卡型号&#xff0c;那么怎么查看电脑的声卡型号?下面小编就为大家详细介绍一下&#xff0c;一起来看看吧&#xff01;使用命令查看1、首先呢&#xff…

spring 配置只读事务_只读副本和Spring Data第1部分:配置数据库

spring 配置只读事务这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目&#xff0c;我们的目标是建立我们的spring数据应用程序&#xff0c;并使用read仓库进行写操作&#xff0c;并基于read副本进行读操作。 为了模拟这种环境&#xff0c…

XML—— XSL 转换

【0】README 0.1&#xff09; 本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML—— XSL 转换 的基础知识 &#xff1b; 0.2&#xff09;XSL 转换&#xff1a; XSL 转换&#xff08;eXtensible StyleSheet Language扩展样式表语言&#xff09; (for detailed…

算法三之堆排序

一、堆(Heap)定义 &#xff08;1&#xff09;n个关键字序列Kl&#xff0c;K2&#xff0c;…&#xff0c;Kn称为&#xff08;Heap&#xff09;&#xff0c;当且仅当该序列满足如下性质&#xff08;简称为堆性质&#xff09;&#xff1a; k(i)<k(2i&#xff09;且k(i)<k(2i…

计算机宏如何设置方法,excel 如何启用宏的方法,以及如何设置excel启用宏

如何启用宏呢&#xff1f;在进行如何启用宏讲解之前&#xff0c;先来认识&#xff0c;Excel几个其余宏相关的知识点。如果Excel工作簿中包含宏&#xff0c;则将在打开工作簿之前对其进行扫描&#xff0c;以检查是否存在已知病毒。Excel宏设置有四个选项&#xff0c;如下图所示&…

怎么清理句柄_JAR文件句柄:混乱后清理!

怎么清理句柄在Ultra ESB中&#xff0c;我们使用特殊的热交换类加载器 &#xff0c;该加载器使我们可以按需重新加载Java类。 这使我们能够从字面上热交换我们的部署单元 -加载&#xff0c;卸载&#xff0c;使用更新的类重新加载&#xff0c;以及正常地逐步退出-无需重启JVM。 …

XML——生成 XML 文档(读入 XML的反向过程)

【0】README 0.1&#xff09; 本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——生成 XML 文档&#xff08;读入 XML的反向过程&#xff09; 的基础知识 &#xff1b; 0.2&#xff09; for source code, please visit https://github.com/pacosonTang/core…

算法四之冒泡排序

一、冒泡排序&#xff08;Bubble Sort&#xff09;思想 &#xff08;1&#xff09;冒泡排序&#xff08;Bubble Sort&#xff09;&#xff0c;是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误…

java 使用sdk_使用SDKMAN管理多个Java SDK! 轻松

java 使用sdkSDKMAN&#xff01; 是用于管理多个软件开发套件的并行版本的便捷工具。 该工具对Java开发人员特别有用&#xff0c;因为它支持JVM的SDK&#xff0c;例如Java&#xff0c;Groovy&#xff0c;Scala&#xff0c;Kotlin和Ceylon。 还支持Gradle&#xff0c;Maven&…

ftp服务器在线查看文件内容,ftp服务器PDF文件在线查看的实现方法

URL形式&#xff1a;// http://localhost:2692/PDFVIEWER/web/viewer.html?filehttp://localhost:2692/TOV/DASystem/GetStreaem?path%3Dftp://ftp账号:ftp密码IP地址/0001/E_File3/2017526/test.PDF注意&#xff1a;PDFVIEWER/web/viewer.html是一个PDF插件地址链接后台方法…

XML——写出XML文档(XSLT+StAX)

【0】README 0.1&#xff09; 本文描述部分转自 core java volume 2 &#xff0c; 旨在理解 XML——写出XML文档&#xff08;XSLTStAX&#xff09; 的基础知识 &#xff1b; 0.2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java-volume…

算法五之快速排序

一、快速排序&#xff08;Quicksort&#xff09;思想设要排序的数组是A[0]……A[N-1]&#xff0c;首先任意选取一个数据&#xff08;通常选用数组的第一个数&#xff09;作为关键数据&#xff0c;然后将所有比它小的数都放到它前面&#xff0c;所有比它大的数都放到它后面&…

jvm 助记符_您的JVM是否泄漏文件描述符-像我的一样?

jvm 助记符前言&#xff1a;此处描述的两个问题是在一年前发现并修复的。 本文仅用作历史证明&#xff0c;也是有关解决Java中文件描述符泄漏的初学者指南。 在Ultra ESB中&#xff0c;我们使用内存RAM磁盘文件缓存来进行快速且无垃圾的有效负载处理。 一段时间以前&#xff0…

08r2系统服务器开索引,SQLSERVER2008R2正确使用索引

T1表 10000000万条数据,(插入时间36分钟&#xff0c;count(*)查询19秒&#xff0c;空间占用670M左右)sql1.真正充分的利用索引好比like 张% 就是符合SARG(符合扫描参数)标准而like %张 就不符合该标准数据库通配符%在字符串首字符的使用会致使索引没法使用&#xff0c;虽然实际…