但是,我被分配了一些工作,它要求我“选择生产下所有项目的文本”,一个单独的问题询问“选择所有部门的所有经理节点”
输出如何看待text()而不是node()
snip的XML
<produce> <item>apple</item> <item>banana</item> <item>pepper</item> </produce> <department> <phone>123-456-7891</phone> <manager>John</manager> </department>
当然,有更多的部门和更多的经理,但这只是一小段代码。
任何帮助将非常感谢!
节点测试对一组(在axis,准确地)节点进行操作,并返回某种类型的节点。当未提及轴时,默认情况下采用子轴。
有各种node tests:
> node()匹配任何节点(它们的最小特定节点test)
> text()仅匹配文本节点
> comment()匹配注释节点
> *匹配任何元素节点
> foo匹配任何名为“foo”的元素节点
> processing-instruction()匹配PI节点(它们看起来像<?name value?>)。
>旁注:*也匹配属性节点,但只沿属性轴。 @ *是attribute :: *的缩写。属性不是子轴的一部分,这就是为什么正常*不选择它们。
这个XML文档:
<produce> <item>apple</item> <item>banana</item> <item>pepper</item> </produce>
表示以下DOM(简化):
root node element node (name="produce") text node (value="\n ") element node (name="item") text node (value="apple") text node (value="\n ") element node (name="item") text node (value="banana") text node (value="\n ") element node (name="item") text node (value="pepper") text node (value="\n")
所以用XPath:
> /选择根节点
> / produce选择根节点的子元素,如果它有名称“produce”(这被称为文档元素;它代表文档本身。文档元素和根节点经常被困惑,但他们不是同一件事。 )
> / produce / node()在/ produce /下选择任何类型的子节点(即所有7个子节点)
> / produce / text()选择4个(!)空格文本节点
> / produce / item [1]选择名为“item”的第一个子元素,
> / produce / item [1] / text()选择所有子文本节点(只有一个 – “apple” – 在这种情况下)
等等。
所以,你的问题
>“选择生产下的所有项目的文本”/ produce / item / text()(选择3个节点)
>“选择所有部门中的所有管理器节点”// department / manager(选择1个节点)
笔记
> XPath中的默认轴是子轴。您可以通过为其他轴名称添加前缀来更改轴。例如:// item / ancestor :: produce
>元素节点具有文本值。当评估元素节点时,将返回其文本内容。在本例中,/ produce / item [1] / text()和string(/ produce / item [1])将是相同的。
>另请参见this answer,其中我以图形方式概述XPath表达式的各个部分。