2014-01-08 106 views
1

我有一些XML,我需要搜索字段符合特定條件的部分。我正在嘗試使用XPath,但不知道如何查找兩個「字段」部分。這裏是查找兩個項目中的XPath:什麼是XPath來搜索多個屬性和元素?

/importJob/links/link/field[@name='ModuleId' and @value='ab6f15c7-bb68-4243-8815-02818c6dbbee']" 

但如果我試試這個,它沒有找到任何物品:

/importJob/links/link/field[@name='ModuleId' and @value='ab6f15c7-bb68-4243-8815-02818c6dbbee' and @name='SystemId' and @value='850fd5eb-0985-4169-bce9-c62ad0335c5f']" 

這裏是源XML:

<importJob> 
    <links> 
    <link linkId="00cb3dca-ffd6-4a90-b690-01e99913708d" LastModifiedDate_UTC="2012-10-24T23:28:00"> 
     <field name="ModuleId" value="ab6f15c7-bb68-4243-8815-02818c6dbbee" /> 
     <field name="SystemId" value="850fd5eb-0985-4169-bce9-c62ad0335c5f" /> 
    </link> 
    <link linkId="00cb3dca-ffd6-4a90-b690-01e99913708d" LastModifiedDate_UTC="2012-10-24T23:28:00"> 
     <field name="ModuleId" value="ab6f15c7-bb68-4243-8815-02818c6dbbee" /> 
     <field name="SystemId" value="3c922537-0457-4fc5-a282-ee5a5f7084f2" /> 
    </link> 
    <link linkId="00cb3dca-ffd6-4a90-b690-01e99913708d" LastModifiedDate_UTC="2012-10-24T23:28:00"> 
     <field name="ModuleId" value="b77d692a-1f89-4abb-8af2-0c955364107a" /> 
     <field name="SystemId" value="850fd5eb-0985-4169-bce9-c62ad0335c5f" /> 
    </link> 
    <link linkId="00cb3dca-ffd6-4a90-b690-01e99913708d" LastModifiedDate_UTC="2012-10-24T23:28:00"> 
     <field name="ModuleId" value="b77d692a-1f89-4abb-8af2-0c955364107a" /> 
     <field name="SystemId" value="3c922537-0457-4fc5-a282-ee5a5f7084f2" /> 
    </link> 
    </links>  
</importJob> 

有人可以通過告訴我是否可以使用XPath來做到這一點,如果是這樣,那麼正確的XPath命令是什麼。在Live代碼中,這將會動態創建,並且可能會有一個或多個「field」元素。我可以編程,但首先需要XPath命令。

編輯1 -------------------------

我的問題可能是更清楚,所以我在這裏加入了一些更多的細節。

我需要返回一個或多個「鏈接」部分,其中所有「名稱」和「值」屬性都與XPath命令匹配。所以根據我的示例xml,我需要創建一個XPath命令,它將返回第一個「鏈接」部分。 ModuleId在前兩個「鏈接」部分中是相同的,這就是爲什麼命令必須使用多個「字段」部分,以便它只返回第一個「鏈接」部分。在我嘗試創建一個XPath命令(上面的第二個命令)時,可以看到它有兩個「名稱」和兩個「值」部分。我希望這會找到第一個「鏈接」部分。

EDIT 2 -------------------------

我現在用的這個XPath命令,它似乎工作。我需要使用一些括號並移動「字段」部分,以便返回鏈接部分。

/importJob/links/link[(field/@name='SystemId' and field/@value='850fd5eb-0985-4169-bce9-c62ad0335c5f') and (field/@name='ModuleId' and field/@value='ab6f15c7-bb68-4243-8815-02818c6dbbee')] 

回答

3

如果要選擇這兩個模塊和系統領域,然後使用或

"/importJob/links/link/field[(@name='ModuleId' and @value='ab6f15c7-bb68-4243-8815-02818c6dbbee') or (@name='SystemId' and @value='850fd5eb-0985-4169-bce9-c62ad0335c5f')]"; 

這給:

<field name="ModuleId" value="ab6f15c7-bb68-4243-8815-02818c6dbbee" /> 
<field name="SystemId" value="850fd5eb-0985-4169-bce9-c62ad0335c5f" /> 
<field name="ModuleId" value="ab6f15c7-bb68-4243-8815-02818c6dbbee" /> 
<field name="SystemId" value="850fd5eb-0985-4169-bce9-c62ad0335c5f" /> 

否則你正在努力尋找現場是模塊和系統在同一時間。因此,你沒有這樣的領域,沒有任何返回。

編輯:您可以使用嵌套的謂詞以下XPath獲得具有與環境兩個領域link元素,你會提供

var xpath = "//link[field[@name='ModuleId' and @value='ab6f15c7-bb68-4243-8815-02818c6dbbee'] and field[@name='SystemId' and @value='850fd5eb-0985-4169-bce9-c62ad0335c5f']]"; 
+0

我已經更新了我的問題,因爲我不認爲這是清楚我試圖實現。我會嘗試一下你給出的例子,看看我是否可以使它與我需要的一致。 – Retrocoder

+0

@Retrocoder所以,你想'鏈接'元素,而不是'field'元素,你在你的代碼中選擇? –

+0

我想要基於其字段值的鏈接部分。我想我已經設法根據你的例子做到了。我將把它放在原來的問題中。 – Retrocoder