什么是搜索多个属性和元素的XPath?

时间:2014-01-08 10:40:50

标签: c# xpath .net-4.5

我有一些XML需要搜索字段符合特定条件的部分。我试图使用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命令是什么。在实时代码中,这将动态创建,并且可能存在一个或多个“字段”元素。我可以对此进行编程,但首先需要XPath命令。

编辑1 -------------------------

我的问题可能更清楚,所以我在这里添加更多细节。

我需要返回一个或多个“链接”部分,其中所有“name”和“value”属性都与XPath命令匹配。所以根据我的示例xml,我需要创建一个XPath命令,它将返回第一个“链接”部分。 ModuleId在前两个“链接”部分中是相同的,因此命令必须使用多个“字段”部分,以便它只返回第一个“链接”部分。在我尝试创建XPath命令(上面的第二个)时,您可以看到它有两个“名称”和两个“值”部分。我希望这会找到第一个“链接”部分。

编辑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')]

1 个答案:

答案 0 :(得分:4)

如果要同时选择模块和系统字段,请使用OR

"/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" />

否则,您正在尝试同时查找模块AND系统的字段。因此,您没有这样的字段,也没有返回任何内容。

编辑:您可以使用以下带有嵌套谓词的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']]";