2014-03-25 50 views
1

有許多這樣的xmlfiles,其結構不相同,可能會有所不同。路徑和運算符以及通配符搜索

<ratings> 
    <rating> 
    <agency>SP</agency> 
    <provider>SP</provider> 
    <type>LONG TERM</type> 
    <currencyType>LOCAL</currencyType> 
    <description>SP Standard LT LC rating</description> 
    <crating by = "Moodys"> 
     <code>BBB+</code> 
    </crating> 
    <crating by = "S&P"> 
     <code>AAA-</code> 
    </crating> 
    <date>2011-09-07</date> 
    </rating> 
</ratings> 

我想找到有BBB +和AAA- 的文本由於XML結構變化我不得不求助於外卡而不能依靠 元素名稱的任何想法所有的XML文檔我該怎麼做,請。

我的嘗試是,但它不工作

//*[. = "BBB+" and . = "AAA-"] 

如果我不使用「和」它的工作原理,但那就不是符合我的標準。

+0

用途|而不是和 – Fireworks

回答

1

你可以試試這個方法:

/*[//*[normalize-space(text()) = 'AAA-'] and //*[normalize-space(text()) = 'BBB+']] 

是否有「文本BBB +和AAA-的」,並返回任何結果/空,否則,將返回元素。除此之外,請檢查來自@Robin的答案,其中包含解釋和建議。

1

編輯:這實際上回答的情況下,你只需要一個條件滿足,即有一個與文本「AAA-」或「BBB +」至少有一個節點

您可以使用

//*[normalize-space(text()) = 'AAA-' or normalize-space(text()) = 'BBB+'] 

這將返回找到文本的節點。您可以直接在text()屬性上添加條件,並且normalize-space函數可修剪來自尾隨空格的文本。

這顯然會很慢,因爲它需要檢查所有節點。如果您可以將*更改爲code,這將大大提高性能。

+0

我想得到的結果,當兩個條件都滿足。在你的情況下,如果我改變'BBB +'的其他東西,甚至那麼我得到的結果是不是我想要的.Apologies如果這不清楚 –

+0

哦,對不起,我沒有得到。 @ har07的答案可能更接近你想要做的事情!我會相應地更新我的「答案」。 – Robin