繁体   English   中英

XPath入门

[英]Getting started with XPath

我是从Pro XML Development with Java自学的XPath。 仅仅为了练习,我构建了一个示例XML文档和一些XPath表达式。
下面是一些XPath表达式及其解释和一些相关问题。 如果我的解释错误,请纠正我,并在适用的地方回答问题。

XML

<?xml version="1.0" encoding="UTF-8" ?>
<people>
    <student scholarship="Yes">
        <name>John</name>
        <course>Computer Technology</course>
        <semester>6</semester>
        <scheme>E</scheme>
    </student>

    <student>
        <name>Foo</name>
        <course>Industrial Electronics</course>
        <semester>6</semester>
        <scheme>E</scheme>
    </student>

    <grumpy-cat>
        <soup-noodle>
            <student>
                <name>Dingle</name>
                <course>Grumpiness</course>
                <semester>3</semester>
                <scheme>E</scheme>
            </student>
        </soup-noodle>
    </grumpy-cat>
</people>  

表达式1: /people/student[@scholarship='Yes']/name
说明:将选择<people>中包含的元素<name>..</name> ,使<student>具有名为scholarship的属性,其值为Yes
问题:这还会选择John中的值????

表达2: /people/student[2]
说明:将选择元素<people>位于第2位的<student>..</student>元素
问题:它还会选择内部的子节点吗?

表达3: /people/student/@scholarship
说明:将在元素学生中选择属性奖学金。 如果有多个<student scholarship="">那么它会选择多个属性

表达式4: //name[ancestor::student]
说明:将选择所有<name>..</name>元素
//意为'所有后代'。 在我的背景下,它意味着“我不关心后代是谁,只要我的直系祖先是学生”

所有四个XPath表达式都选择输入树中的节点,如果你使用XPath 1.0这样的XPath表达式返回一组节点(其中集合可以是空的或包含输入树的一个或多个节点),如果你使用XPath 2.0这样的话表达式返回一系列节点(也可以是空的,或者可以包含输入树的一个或多个节点)。

  1. 您的第一个表达式在给定输入树中选择一个name元素节点,此节点包含值为John的单个文本节点。
  2. 你的第二个表达式选择一个student在输入树元素节点,即student元素节点有几个子节点(和XPath的选择也只需选择输入树中的节点,它不会做任何修改或创建新的节点)。
  3. 你的第三个表达式选择一个scholarship属性节点,如果输入XML包含几个具有scholarship属性的student元素节点,你就会选择几个这样的节点。
  4. 你的第四个表达式//name[ancestor::student]/descendant-or-self::node()/name[ancestor::student]的简短形式(参见http://www.w3.org/TR/xpath/#path-abbrev/descendant-or-self::node()/name[ancestor::student]/descendant-or-self::node()/child::name[ancestor::student]的缩写形式。 因此,它选择根节点的所有name子元素以及根节点的所有后代节点,其中name元素具有student祖先元素节点。 你对这个表达的解释是错误的,关于all the descendants的部分(这至少是不精确的)以及my immediate ancestor is student 直接祖先是父母,在XPath中简单地表示为parent::student ,而您的ancestor::student查找所有级别的祖先。 所有的后代都是/descendant::name 另一方面,通过定义//的方式和你的下一步name //name归结为与/descendant::name相同。

表达式1: /people/student[@scholarship='Yes']/name说明:将选择包含在其中的元素,其中包含一个名为scholarship的属性,其值为Yes。问题:这也会选择值John在里面 ????

此表达式选择任何(所有) name元素,该元素是student元素的子元素(其scholarship属性具有字符串值为字符串“yes”),并且是XML文档的顶部元素(名为people )的子元素。 XPath不选择“值” - 它选择节点 在这种情况下,字符串“John”是所选name元素的字符串值。 所选name元素具有单个子文本节点,其字符串值为“John”。

表达式2:/ people / student [2]说明:将选择元素位于元素中的第2位置问题:它是否也会选择其中的子节点?

这将选择顶部元素的第二个(按文档顺序) student子元素(其名称必须是people )。 所选元素的子节点本身不会被选中。 可以使用count()函数获取所选节点的count()

count(/people/student[2])

它是1 - 这意味着只选择了元素(但不是它的子元素或后代)。

表达式3:/ people / student / @ scholarship说明:将在元素学生中选择属性奖学金。 如果有多个则会选择多个属性

这将选择任何student元素的scholarship属性,该元素是top元素的子元素(其名称必须是people )。 这意味着如果有N个student元素是people顶级元素的子元素,并且如果每个元素都具有scholarship属性,则将选择N个奖学金属性。

表达式4:// name [ancestor :: student]说明:将选择所有..元素//表示'all-the-descendants'。 在我的背景下,它意味着“我不关心后代是谁,只要我的直系祖先是学生”

这将选择具有student祖先的所有name元素(并且此祖先不仅可以是直接父级,还可以是直接父级的祖先)。

这里可以编写一个不包含任何反向轴的等效XPath表达式:

//student//name

如果您想要选择父项为student元素的所有name元素,表达方式的一种方法是:

//student/name

最后,我建议使用像XPath Visualizer (我12年前创建的)这样的工具,它帮助成千上万的人通过玩耍和玩乐来学习XPath

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM