3

此刻我的脚趾浸入一点 Java 中,并有一个关于 XPath 的问题。

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

这是我的 Xml 的粗略轮廓:

<Page>
  <ComponentPresentations>
    <ComponentPresentation>
      <Component>
        <Title>
      <ComponentTemplate> 
    <ComponentPresentation>
      <Component>
        <Title>
      <ComponentTemplate> 

我的第一个 XPath<Component>根据<ComponenTemplate>Id 值的值选择节点:

String componentExpFormat = "/Page/ComponentPresentations/ComponentPresentation/ComponentTemplate/Id[text()='%1$s']/ancestor::ComponentPresentation";
String componentExp = String.format(componentExpFormat, template);
XPathExpression expComponent = xPath.compile(componentExp);
Node componentXml = (Node) expComponent.evaluate(xmldoc, XPathConstants.NODE);

这给了我<Component>我想要的,但我不能;然后似乎无法针对节点进行 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

这是唯一的方法吗?

干杯

4

1 回答 1

3

带有前导斜杠的 XPath 表达式

/Component/Fields/item

absolute,当您使用特定的上下文节点评估它时,它将从上下文节点所属的文档的根开始查找。如果删除前导斜杠

Component/Fields/item

它将寻找Component上下文节点的子节点。

顺便说一句,您可以稍微简化这些 XPath,您不需要所有上下树的东西ancestor::,也不需要使用text()

componentExpFormat = "/Page/ComponentPresentations/ComponentPresentation[ComponentTemplate/Id='%1$s']";
componentExpTitle = "Component/Fields/item/value/Field[Name='title']/Values/string";
于 2013-05-13T16:52:47.043 回答