3

ちょっと Java に足を踏み入れて、XPath について質問があります。

大きな Xml があり、XPath を使用して特定のノードを取得し、この小さな Xml チャンクに対してさらに XPath 呼び出しを実行したいと考えています。

私のXmlの大まかな概要は次のとおりです。

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

私の最初の XPathは、 Id 値<Component>の値に基づいてノードを選択します。<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

それが唯一の方法ですか?

乾杯

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 に答える