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()),'慢慢')]"