如何使用xpath搜索特定子节点而不是其他子节点包含某些关键字的元素?

时间:2013-12-20 08:29:31

标签: php xml xpath

我承认我的问题很冗长,可能含糊不清。所以我把它放在这个例子中:

<freshvideos>
    <video>
        <id>
            <![CDATA[ 4f1a6a21egfw4227eaff33de8f571f95 ]]>
        </id>
        <title>
            <![CDATA[ New England Snowstorm - \"Low Gear\" ]]>
        </title>
        <ensub>
            <![CDATA[ I put it in low gear and take it slow. ]]>
        </ensub>
        <cnsub>
            <![CDATA[ 我挂了抵挡,慢慢开。 ]]>
        </cnsub>
        <filesrc>
            <![CDATA[ videos/New England Snowstorm Low Gear.mp4 ]]>
        </filesrc>
    </video>
    <video>
        <id>
            <![CDATA[ 5fgssd21e779d227eaff33de8f5gesfg ]]>
        </id>
        <title>
            <![CDATA[ New England Rain- \"High Gear\" ]]>
        </title>
        <ensub>
            <![CDATA[ I put it in high gear and take it quick. ]]>
        </ensub>
        <cnsub>
            <![CDATA[ 我挂了高挡,快快开。 ]]>
        </cnsub>
        <filesrc>
            <![CDATA[ videos/New England Rain High Gear.mp4 ]]>
        </filesrc>
    </video>
</freshvideos>

我想通过在“title”,“ensub”和“cnsub”中搜索关键字来查明一个“视频”的ID,但不能在“filesrc”中找到。

说,如果我搜索“gear slow慢”,它分别出现在第一个视频的“ensub”和“cnsub”中,它会返回第一个“视频”。

目前,我正在使用

xpath "//video[contains(.,'gear') and contains(.,'慢慢')]".

问题是我不想搜索像“filesrc”这样的其他元素,因为我担心我的php托管服务器的性能。

所以我也试过xpath:

"video[title[contains(.,'gear') and contains(.,'慢慢')]|
ensub[contains(.,'gear') and contains(.,'慢慢')]|
cnsub[contains(.,'gear') and contains(.,'慢慢')]]"

新问题是,如果我在两个contains()之间使用“和”,则不匹配任何视频元素。如果我在它们之间使用“或”,则所有视频元素都匹配。

我也试过

"video[contains(tile|ensub|cnsub,'gear') and contains(tile|ensub|cnsub,'慢慢')]"

它没有选择任何东西。我在xpath中想念一下吗?

那么是否有一个xpath表达式意味着“匹配'''''元素,'title','ensub'和'cnsub'一起包含'gear'和'慢慢'?”

提前致谢!! 希望我能理解。

2 个答案:

答案 0 :(得分:0)

如果您只需要匹配集合(tile|ensub|cnsub)中的一个元素:

"//video[ (tile|ensub|cnsub)[contains(.,'gear')] and
          (tile|ensub|cnsub)[contains(.,'慢慢')] ]"

如果您只需要确保video元素的子元素包含两个搜索词:

"//video[ *[contains(.,'gear')] and *[contains(.,'慢慢')] ]"

在你测试它之前,我认为你不应该排除第二种方法。我怀疑它会对您的查询性能产生重大影响。

<强>更新

从第一个代码示例中删除了XPath 2.0函数string-join()

答案 1 :(得分:0)

我自己解决了这个问题。 我用了

"video[contains(concat(title/text(),ensub/text()),'gear') and contains(concat(title/text(),ensub/text()),'慢慢')]"