2015-04-30 65 views
1

我想从以下类型的XML的多个或“包含”条件

第一种情况下提取的导演和演员

Directors <a href="">Leslie Greif</a>. With <a href="">Wendi McLendon-Covey</a>, <a href="">Tammin Sursok</a>, <a href="">Jesse Bradford</a>, <a href="http://www.mymovies.it/biografia/?a=141527">Reid Ewing</a>. Genre <a href="">Commedy</a> 

由于this答案,现在我可以从演员导演分开通过寻找'与'字符串:

.//a[following-sibling::text()[contains(., 'With')]] 

第二种情况

不幸的是有这样的情况,有没有演员,所以没有“与”字符串,但只有“流派”

Director <a href="">Michael Mellon</a>, <a href="">Alexander Rossi</a>. Genre <a href="">Doc</a> 

所以我猜下面的XPath可以完美的工作:

.//a[following-sibling::text()[contains(., 'With') or contains(., 'Genre')]] 

但此XPath不提取每一个名字最多类型独立是否存在或有没有字符串'With'。它并不关心第一个条件('With')。

+0

如果您可以在问题中添加一个或两个标签来指示您使用哪种主机语言来执行XPath表达式,将会有所帮助。从你对我的回答的评论来看,我猜测PHP DOMXPath,但只有你可以确认。 –

回答

0

你可以看它周围的其他方法 - 为导演找到包含要么GenreWith第一个文本节点,然后提取它的所有a元素

text()[contains(., 'With') or contains(., 'Genre')][1]/preceding-sibling::a 

和对于演员你想要的所有a元素在WithGenre之间(如果没有With,可能为零)

a[preceding-sibling::text()[contains(., 'With')]] 
[following-sibling::text()[contains(., 'Genre')]] 
+0

对不起,但我尝试了下面的代码循环和你的第一个片段:'$ direct = xpath-> query(“text()[contains(。,'With')或contains(。,'Genre')] [ 1]/preceding-sibling :: a“,$ result); ($直接作为$ item){$ director = $ director。“,”。$ item-> nodeValue;}'但是不匹配任何东西。 – Nicero

+0

@Nicero什么是'$ result'?我的表达式假定上下文是'a'元素的父元素,'With'和'Genre'文本节点,如果它是其他任何需要调整以匹配结构的东西。 –

+0

@Nicero要注意的另一件事是表达式将返回元素节点列表('a'元素),并且在DOM中'nodeValue'并不意味着您认为它对元素节点所做的事情。如果你想要'a'元素中的文本,那么你应该使用'textContent'而不是'nodeValue'。 –