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

Php 如何使用xpath搜索其特定子元素而不是其他子元素包含特定关键字的元素?,php,xml,xpath,Php,Xml,Xpath,我承认我的问题很罗嗦,可能模棱两可。所以我把它放在这个例子中: <freshvideos> <video> <id> <![CDATA[ 4f1a6a21egfw4227eaff33de8f571f95 ]]> </id> <title> <![CDATA[ New England Snowstorm - \"Low

我承认我的问题很罗嗦,可能模棱两可。所以我把它放在这个例子中:

<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>

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

所以我也尝试了xpath:

"video[title[contains(.,'gear') and contains(.,'慢慢')]|
ensub[contains(.,'gear') and contains(.,'慢慢')]|
cnsub[contains(.,'gear') and contains(.,'慢慢')]]"
新的问题是,如果在两个包含之间使用and,则没有匹配的视频元素。如果在它们之间使用or,则所有视频元素都是匹配的

我也试过了

"video[contains(tile|ensub|cnsub,'gear') and contains(tile|ensub|cnsub,'慢慢')]"
它什么也没选。我在xpath中遗漏了什么吗

那么是否有一个xpath表达式表示匹配“video”元素,该元素的“title”、“ensub”和“cnsub”一起包含“gear”和“gear”慢慢' ?

提前谢谢!!
希望我被理解。

如果您只需要匹配集合互动程序中的一个元素| ensub | cnsub:

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

"//video[ *[contains(.,'gear')] and *[contains(.,'慢慢')] ]"
我不认为你应该排除第二种方法,直到你测试过它。我怀疑这会对你的查询产生实质性的影响

更新


从第一个代码示例中删除了XPath 2.0函数字符串联接。

我自己解决了这个问题。 我曾经


我不想搜索像filesrc这样的其他元素,因为我担心我的php托管服务器的性能,实际的XML会有多复杂?您已经在搜索可能使用复杂XPath的3个子元素,但担心使用简单XPath再包含一个子元素?您好@Passerby!你是说我的xml一点也不复杂吗?我只是不知道我的xpath是否简单?非常感谢。我认为您的XML一点也不复杂。不成熟的优化可能对你不利。谢谢@过路人你的评论对我很有用!嗨@joemfb!我对第一种方法感兴趣!我需要匹配所有三个元素标题| ensub | cnsub。我如何从您的第一个xpath方法中获得这一点?谢谢字符串连接函数在我的php上不起作用:警告:DOMXPath::query[DOMXPath.query]:xmlXPathCompOpEval:在中找不到函数字符串连接。。。有解决方法吗?我的错误,字符串连接是一个XPath 2.0函数。我只是用它来避免两次指定元素集。我会更新我的答案。嗨@joemfb!我已经得到了答案。多亏了你的灵感,我改用了concat!再次感谢!
"//video[ (tile|ensub|cnsub)[contains(.,'gear')] and
          (tile|ensub|cnsub)[contains(.,'慢慢')] ]"
"//video[ *[contains(.,'gear')] and *[contains(.,'慢慢')] ]"
"video[contains(concat(title/text(),ensub/text()),'gear') and contains(concat(title/text(),ensub/text()),'慢慢')]"