2016-04-15 40 views
1

我試圖按公司名稱篩選作業的XML文檔。使用XPath通過多個值進行篩選

我能拉動符合使用具體的公司名稱,所有項目:

doc.xpath("/source/job[company[text() = 'BigCorp' or text() = 'MegaCorp']]") 

我不能做相反的事情,並通過將這些值排除,使用類似:

doc.xpath("/source/job[company[text() != 'Hodes' or text() != 'Scurri']]") 

在哪裏我錯了嗎?有沒有辦法提供逗號分隔的值列表?

+0

簡而言之:https://en.m.wikipedia.org/wiki/De_Morgan%27s_laws – Phrogz

+0

歡迎來到Stack Overflow。詢問時,我們需要顯示問題所需的最小輸入數據以及預期輸出。請閱讀「[問]」和「[mcve]」。 –

回答

3

嘗試改變orand

doc.xpath("/source/job[company[text() != 'Hodes' and text() != 'Scurri']]") 

如果使用or,它總是要返回工作。

例如,它將返回公司Hodes的工作,因爲text() != 'Scurri'爲真(反之亦然)。


關於以下評論:

所以normalize-space()做到了! doc.xpath("/source/job[company[normalize-space() != 'Hodes' and normalize-space() != 'Scurri']]")不知道爲什麼?

原因normalize-space()工作是因爲text()也將返回空白。

舉例來說,如果你有這樣一個元素:

<company> 
Hodes 
</company> 

或:

<company> Hodes </company> 

text()就等於 「_Hodes_」。 (我用_替換空格以使它們更容易看到。)

由於空白,「_Hodes_」不等於「Hodes」。

使用normalize-space()將剝去前/後空格,並用單個空格替換多個空格。

+0

謝謝 - 我試過,但它仍然返回這些公司doc = doc.xpath(「/源/作業[公司[文本()!='Hodes'和文本()!='Scurri']]」)' – cman77

+0

@ cman77 - 你能爲你的問題添加一個簡單的例子嗎?也許還可以嘗試用'normalize-space()'替換'text()'。 –

+0

so'normalize-space()'做到了! 'doc.xpath(「/ source/job [company [normalize-space()!='Hodes'and normalize-space()!='Scurri']]」)'不知道爲什麼? – cman77