在一分钟内用一点Java蘸我的脚趾,并对XPath有疑问。
我有一个很大的Xml,我想使用XPath来获取一个特定的节点,然后针对这个小块的Xml发出更多的XPath调用。
这是我的Xml的粗略轮廓:
<Page>
<ComponentPresentations>
<ComponentPresentation>
<Component>
<Title>
<ComponentTemplate>
<ComponentPresentation>
<Component>
<Title>
<ComponentTemplate>
我的第一个XPath根据<Component>
Id值的值选择<ComponenTemplate>
节点:
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
这是唯一的方法吗?
干杯
答案 0 :(得分:3)
带有前导斜杠的XPath表达式
/Component/Fields/item
是绝对,当您使用特定上下文节点对其进行评估时,它将从上下文节点所属的文档的根开始查找。如果删除前导斜杠
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";