• 1. 第七章XPATH
  • 2. 课程目标 什么是XPATH XPATH的基本语法 XPath API类的介绍 XPath API接口的介绍
  • 3. 体验项目—— 在XSL中引入XPath来查询关于学生信息的文档中的如下内容: 运行效果图使用“|”操作符显示所有的姓名和年龄。 使用通配符“*”显示所有的字符数据。 使用通配符“*”显示所有的姓名。 显示学生的数量,判断电话或手机号码 是否包含“8”、学生是否姓“李”。显示所有的编号属性。 显示处理指令和注释。 学生的电话或手机的位数。
  • 4. XPath简介 XPath是W3C定义的语言和正式的W3C推荐的语言,W3C拥有XML Path Language (XPath) Version 1.0规范。XPath诞生于1999年,作为对XSLT和XPointer语言的补充,但近来已成为流行的独立语言,因为单个XPath表达式可用于替代多行DOM API代码。 使用XPath的目的:为了在匹配XML文档结构时能够准确地找到某一个节点元素。可以把XPath比作文件管理路径,通过文件管理路径,可以按照一定的规则查找到所需要的文件;同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点,显然这对XSLT来说是一个最最基本的功能。
  • 5. XPath的基本语法 XPath中对元素和属性的匹配,主要有以下几种: 选择分支 定位节点 选择未知元素 选择属性 XPath语法主要是关于一下几方面: XPath表达式 XPath中对元素和属性的匹配XPath定位路径 XPath函数库
  • 6. 定位节点 每个XML文档都可看成是一棵树,该树与计算机中的树形文件夹非常类似,XPath使用以斜线分隔的子元素名的列表来描述某个XML文档的路径所匹配的元素。 /class/student表示选择“class”元素下所有的“student”元素 /class/student/name表示选择“class”元素下所有的“student”元素
  • 7. 选择未知元素 /class/student/*用于选择“class”元素下所有的“student”元素的所有 子元素 /class/*/name用于选择“class”元素下所有的子元素下的所有 “name”元素 /*/*/name用于选择具有两个祖先的所有“name”元素 //*用于选择该文档中的所有元素 在实际应用中我们经常会使用通配符“*”来选择未知的XML元素。如下:
  • 8. 选择分支 通过在XPath语句中使用中括号“[ ]”可以进一步指定某个元素。在中括号中可以使用各种函数、数值、表达式等来指定某个符合条件的元素。如下:/class/student[1] 选择“class”元素下的第一个“student”子元素 /class/student[age]选择“class”元素下含有“age”元素的所有 “student”元素 /class/student[age=20]选择“class”元素下“student”元素中的“age”元素 值为20的所有“student”元素 /class/student[age=20]/name选择“class”元素下的“age”元素值为20的所有“student”元素下的所有“name”元素 /class/student[last()]选择“class”元素下的最后一个“student”子元素
  • 9. 选择多个路径 通过在XPath语句中使用“|”操作符来选择多个路径。如下:/class/student/name | /class/teacher/name表示选择“class”元素下“student”元素中的所有“name”元素和“class”元素下“teacher”元素中的所有“name”元素 //name | //age | //email选择文档中所有的“name”元素、“age”元素和“email”元素 //name | /class/student/age 选择文档中所有的“name”元素和“class”元素下“student”元素中的所有“age”元素
  • 10. 选择属性 在XPath语法中,要获得属性信息必须以前缀“@”来指定,如下 ://@ id表示选择所有属性名为“id”的属性 /class/student[@ id]表示选择“class”元素下包含有“id”属性的所有“student”元素 /class/student[@ *]表示选择“class”元素下包含有属性的所有“student”元素 /class/student[@ id=' ADR02']表示选择“class”元素下包含有“id”属性的值为“ADR02”的所有“student”元素
  • 11. 匹配元素和属性的示例 该文档中的所有元素的字符数据:

    最后一个学生的姓名:

    所有的姓名:

    年龄为23的学生的姓名:

    学生的姓名和年龄:

    所有的id属性:

  • 12. XPath定位路径 一个XPath定位路径表达式将返回一个符合条件的节点集。定位路径可以是相对路径,也可以是绝对路径。绝对定位路径以一个斜线“/”开头,而相对定位路径则没有。定位路径是由一个或多个定位步骤组成,每个步骤用一个斜线分隔。 定位绝对路径的表达式如下所示: /class/student/name 定位相对路径的表达式如下所示: class/student/name
  • 13. 定位步骤 定位步骤按照顺序从左到右依次求值。每一个定位步骤都是相对于上下文节点集中的节点进行求值的。一个定位路径由若干个定位步骤组成。 一个定位步骤一般有三部分: 一个轴,它指定了定位步骤选择的节点与上下文节点之间的关系。 一个节点测试,它指定定位步骤选择的节点的节点类型以及节点扩展名。 零个或零个以上的判定语句,它使用专有的表达式进一步细化定位步骤选择的节点集合。
  • 14. 定位步骤的语法 定位步骤的语法是由两个冒号分开的轴名和节点测试组成,其后可跟随零个或零个以上在方括符内的表达式。 child::age[age=20]轴名一般格式如下:判定语句节点测试
  • 15. 轴 用到的轴主要有以下几种 :child:当前节点所有的子节点。例如:child::*表示选择当前节点的所有子元素child::text()表示选择当前节点的文本节点。child::node()表示选择当前节点的所有子节点。 descendant:该轴包含该节点的后裔;后裔是一个孩子或一个孩子的孩子,等等,后裔轴从来不包含属性或命名空间节点。例如:descendant::name表示选择当前节点的后代中所有name元素。 parent:当前节点的所有父节点。 ancestor:该轴包含该节点的所有祖先节点,该节点的祖先由该节点的父节点以及父节点的父节点等组成。这样,祖先轴将总是包括根节点,除非该节点是根节点;例如:ancestor::age表示选择当前节点的祖先节点中所有的age元素。 following-sibling:包含该节点的所有在其后的兄弟,如果该节点是属性节点或命名空间节点,following-sibling 则为空。
  • 16. preceding-sibling:包含该节点的所有在其前的兄弟,如果该节点是属性节点或命名空间节点,则preceding-sibling轴为空。 following:包含在该节点所在的同一文档中,所有依照文档顺序在该节点后的节点,但排除所有的后裔,也排除属性节点以及命名空间节点。 preceding:包含在该节点所在的同一文档中,所有依照文档顺序在该节点前的节点,但排除所有的后裔,也排除属性节点以及命名空间节点。 attribute:包含该节点的属性,除非该节点是元素,该轴将为空。例如:attribute::* 表示选择当前节点的所有属性。 namespace:包含该节点的命名空间节点,除非该节点是元素,该轴将为空。 self:只包含该节点本身。  ancestor-or-self:包含该节点和该节点的祖先;这样该轴将总是包括根节点。 descendant-or-self:包含该节点和该节点的后裔。
  • 17. 节点测试 节点测试是一个条件,并且是路径表达式中定位步骤的第二个组件。在该轴中选定的所有节点都必须满足此条件。有以下两种 以节点名作为节点测试 以节点类型作为节点测试 有如下的路径表达式 :/child::name 以节点名“name”作为节点测试 child:: text() 以节点类型作为节点测试
  • 18. 以节点类型作为节点测试 主要节点类型有: node( ):任何类型的节点。 processing-instruction( ):处理指令节点。 text( ):文本类型节点。 comment( ):表示注释节点。
  • 19. XPath表达式 XPath除了定位路径表达式外,还有许多其它的基本表达式结构,包括布尔、等式、关系和数值表达式。它们通常用于XPath谓词和各种XSLT结构中。 关系表达式 数值表达式 数值表达式的运算符主要包括:加(+)、减(-)、乘(*)、除(div)和取模(mod)。一般格式如下:操作数1 运算符 操作数2
  • 20. 关系表达式 关系表达式主要用于对两个值的比较,其中主要的运算符及其用法如表所示: 运算符作用=判断两个数值是否相等!=判断操作数1是否不等于操作数2<小于<=小于等于>大于>=大于等于or或and和
  • 21. XPath函数库 XPath提供了函数库以方便计算表达式。我们可以使用XPath函数改进XPath的查询,并提高XPath的编程能力和其灵活性。 XPath函数库中的函数主要分为 字符串函数 节点集函数 布尔函数 数值函数 注意:使用XPath函数时必须严格区分函数名的大小写和参数信息。
  • 22. 节点集函数 XPath的节点集函数主要有以下几种: count( ):该函数返回被选元素的数目。 id( ):通过元素的唯一ID选择元素。 last( ):返回最后一个节点是第几个节点。 local-name( ):返回节点集中第一个节点的local name。 name( ):返回元素的元素名。 namespace-uri( ):返回节点集中第一个节点的命名空间URI。  position( ):返回被选元素是第几个节点。
  • 23. 节点集函数示例 将元素名和字符数据用等号连接:
    =
    “person”元素的数量:

    =
  • 24. 字符串函数 字符串函数有如下几种: concat( ):返回字符串连接的结果。 contains( ):如果第一个字符串包含第二个字符串,则返回真,否则返回假。 normalize-space( ):返回去除了前后空白以及重复空白的参数字符串。 starts-with( ):如果第一个字符串以第二个字符串开头则返回真,否则返回假。 string( ):将对象转换为字符串。 string-length( ):返回一个字符串的长度。 substring( ):返回第一个参数中从第二个参数指定的位置开始、第三个参数指 定的长度的字符串 substring-after( ) :返回字符串中从开始到某一字符串第一次出现的位置后的 字符串。
  • 25. 字符串函数示例 是否包含单词“May”:


    是否以数字“8”开头:
    单词的长度: 26. 数值函数数值函数主要有以下几种: ceiling( ):返回不小于参数的最小整数。 floor( ):返回不大于参数的最大整数。 number( ):将参数转换为数字。 round( ):返回与参数最接近的整数值。  sum( ):返回节点集中所有节点的总和。每个节点在求和之前先转换为数值。 如: ceiling(4.3)将返回4。 round(4.7)将返回5 sum(class/student/money)返回学生的钱数的总和
  • 27. 布尔函数布尔函数主要用于对参数表达式进行计算,并返回结果。有如下几种: boolean():将参数转换为布尔值。 如果参数是负数或正数,将转换为布尔值true。 如果参数为零或NaN值,将转换为false。 如果参数为非空的节点集,将转换为true;空节点集将转换为false。 如果参数为非空的字符串,将转换为true;空字符串将转换为false。 如果参数不属于四种基本类型的对象,将通过该类型相应的方式转换为布尔值 。 false( ):返回false。 lang( ):如果该节点的xml:lang属性与参数字符串相同,则返回true。此函数不常用。 not( ):如果参数为false,则返回true,否则,返回false。  true( ):返回true。
  • 28. XPath API的使用 XPath表达式比繁琐的文档对象模型(DOM)代码要容易编写得多。如果需要从XML文档中提取信息,最快捷、最简单的办法就是在Java程序中嵌入XPath表达式。在Java版本中推出了javax.xml.xpath包,这是一个用于XPath文档查询的独立于XML对象模型的库。 XPath API的常用类及接口如下: XPath 接口 XPathFactory类 XPathVariableResolver接口和XPathFunctionResolver接口 XPathExpression接口XPathVariableResolver接口和XPathFunctionResolver接口主要用于在程序中定义和使用XPath的扩展函数,一般不常使用。
  • 29. XPathFactory类 XPathFactory实例可用于创建XPath对象。该类只有一个受保护的空构造方法,常用的方法主要有以下几种: abstract void setXPathFunctionResolver(XPathFunctionResolver resolver):建立默认函数解析器。 static XPathFactory newInstance( ):获取使用默认对象模型(DOM)的新XPathFactory 实例。 abstract void setXPathVariableResolver(XPathVariableResolver resolver):建立默认变量解析器。 abstract boolean isObjectModelSupported(String objectModel):此XPathFactory是否支持指定的对象模型。 在实际应用中经常会使用的newInstance( )静态方法来获得一个该类的实例,
  • 30. XPath 接口 提供了对XPath计算环境和表达式的访问。XPath对象不是线程安全的,也不能重复载入。也就是说应用程序负责确保在任意给定时间内不能有多个线程使用一个XPath对象。 常用方法有以下几种 :void reset():将此XPath重置为其初始配置。 XPathExpression compile(String expression):编译XPath表达式。 void setXPathFunctionResolver(XPathFunctionResolver resolver):建立函数解析器。 void setNamespaceContext(NamespaceContext nsContext):建立名称空间上下文。 void setXPathVariableResolver(XPathVariableResolver resolver):建立变量解析器。
  • 31. XPathExpression接口 XPathExpression接口提供了对编译后的XPath表达式的访问。如果表达式包含变量,则其值将通过XPathVariableResolver()方法找到,如果变量解析器未定义或解析器返回null,将会抛出异常。如果表达式包含函数引用,则函数将通过XPathFunctionResolver()方法找到。如果函数解析器未定义或解析器为函数返回null,将会抛出异常。 该接口最长用的方法是evaluate()方法,如下: String evaluate(InputSource source):计算指定InputSource编译后的XPath表达式并将结果以字符串形式返回。 String evaluate(Object item):计算指定编译后的XPath表达式并以字符串形式返回。 Object evaluate(Object item, QName returnType): 计算指定的XPath表达式并返回指定类型的结果。 Object evaluate(InputSource source, QName returnType):计算指定InputSource编译后的XPath表达式并返回指定类型的结果。
  • 32. XPath API的使用示例import javax.xml.parsers.*; import javax.xml.xpath.*; import org.w3c.dom.*; public class TestXpath2{ public static void main(String[ ] args)throws Exception{ DocumentBuilderFactory domFactory= DocumentBuilderFactory.newInstance( ); DocumentBuilder builder=domFactory.newDocumentBuilder( ); Document doc=builder.parse("cdcatalog.xml"); //获取一个XPathFactory实例 XPathFactory factory = XPathFactory.newInstance( ); XPath xpath = factory.newXPath( ); //使用XPath函数 XPathExpression expr= xpath.compile("sum(//cd/price)"); String result =expr.evaluate(doc); System.out.println(result); } } 在XPath表达式中使用XPath函数库的sum()函数。
  • 33. XPath的数据类型 XPath 1.0只有四种基本的数据类型: number(数值型) node-set(节点型) boolean(布尔型) string(字符串型) XPath的数据类型在Java中的对应关系如下表: XPath数据类型映射到Java中node-set(节点型)org.w3c.dom.NodeListnumber(数值型)doubleboolean(布尔型)booleanstring(字符串型)String
  • 34. 在计算XPath表达式时,使用XPathExpression接口的evaluate()方法。该方法可以有两个参数。其中第二个参数就是用于指定需要的返回类型,该参数的值都是在XPathConstants中已经命名的静态字段。如下: XPathConstants.BOOLEAN XPathConstants.NODESET XPathConstants.NUMBER XPathConstants.STRING XPathConstants.STRING XPathConstants.NODE并没有匹配的XPath类型,它主要适用于当XPath表达式的结果有且只有一个节点。如果XPath表达式返回了多个节点,却指定类型为XPathConstants.NODE,则evaluate()方法将按照文档顺序返回第一个节点。如果XPath表达式的结果为一个空集,却指定类型为XPathConstants.NODE,则evaluate( )方法将返回null。
  • 35. 实践项目——< XPath表达式处理关于学生信息的文档 > 程序的实现要求如下: (1)使用通配符“*”显示所有的字符数据和所有的姓名信息。 (2)使用“|”操作符显示所有的姓名和年龄。 (3)显示所有的编号属性。 (4)显示处理指令和注释。 (5)显示学生的数量、电话号码是否包含“8”、学生是否姓“李”。 (6)学生的电话或手机的位数。
  • 36. 本章总结 CSS样式表介绍 XSL介绍 XSL语言的语法 如何将XML和XSL配合使用