Java根据org.w3c.dom.Node评估XPath

Java根据org.w3c.dom.Node评估XPath,java,xpath,Java,Xpath,我现在正在学习一点Java,我有一个关于XPath的问题 我有一个很大的Xml,我想使用XPath来抓取一个特定的节点,然后对这个小Xml块发出进一步的XPath调用 下面是我的Xml的大致轮廓: <Page> <ComponentPresentations> <ComponentPresentation> <Component> <Title> <ComponentTempla

我现在正在学习一点Java,我有一个关于XPath的问题

我有一个很大的Xml,我想使用XPath来抓取一个特定的节点,然后对这个小Xml块发出进一步的XPath调用

下面是我的Xml的大致轮廓:

<Page>
  <ComponentPresentations>
    <ComponentPresentation>
      <Component>
        <Title>
      <ComponentTemplate> 
    <ComponentPresentation>
      <Component>
        <Title>
      <ComponentTemplate> 
这给了我
我想要但我可以;似乎无法针对节点执行XPath:

String componentExpTitle = "/Component/Fields/item/value/Field/Name[text()='title']/parent::node()/Values/string";                                  
XPathExpression expTitle = xPath.compile(componentExpTitle);
String eventName = expTitle.evaluate(componentXml, XPathConstants.STRING).toString();
如果没有这个,我每次都必须包含完整的XPath:

/Page/ComponentPresentations/ComponentPresentation/ComponentTemplate/Id[text()='%1$s']/ancestor::ComponentPresentation/Component/Fields/item/value/Field/Name[text()='title']/parent::node()/Values/string
这是唯一的办法吗


Cheers

带前导斜杠的XPath表达式

/Component/Fields/item
Component/Fields/item
是绝对的,当您使用特定上下文节点对其求值时,它将从上下文节点所属文档的根开始查看。如果删除前导斜杠

/Component/Fields/item
Component/Fields/item
它将查找上下文节点的子级

顺便说一句,您可以大大简化这些XPath,您不需要使用
祖先::
,也不需要使用
文本()


您的
componentExpTitle
是一条绝对路径,请删除前导斜杠并尝试它。Ian,如果是这样,我会让我投票不止一次,因为我的朋友您让我接下来的几个小时变得更轻松了,而且我一路改进了XPath!干杯