2014-01-08 45 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