2

我正在尝试使用 contains 查找元素。问题是如果字符串包含一个单引号或双引号,则很难得到它。我正在使用这个 xpath 直接匹配第一个元素。有没有更好的方法来实现而不在这里使用'and'语句?

使用的 Xpath:-

.//*[local-name()='GEOGRAPHY_TITLE'][contains(.,"APAC > Andaman Islands > test&'<,")and contains(., '"123')]

使用的 XML :-

<MST>
<MST_GEOGRAPHY >
               <GEOGRAPHY_TITLE>APAC &gt; Andaman Islands &gt; test&amp;'&lt;,\"123</GEOGRAPHY_TITLE>
               <GEOGRAPHY_ID>5a7a24ec-93ff-8be6-7ef9-fa021500df0e</GEOGRAPHY_ID>
               <TENANT_ID>{0559cdcb-c63b-4c81-be91-b78e831bf5a5}</TENANT_ID>
               <ACTIVE>1</ACTIVE>
</MST_GEOGRAPHY>
<MST_GEOGRAPHY >
               <GEOGRAPHY_TITLE>APAC &gt; Andaman Islands &gt; test\"123&amp;'&lt;,\"123</GEOGRAPHY_TITLE>
               <GEOGRAPHY_ID>5a7a24ec-93ff-8be6-7ef9-fa021500df0e</GEOGRAPHY_ID>
               <TENANT_ID>{0559cdcb-c63b-4c81-be91-b78e831bf5a5}</TENANT_ID>
               <ACTIVE>1</ACTIVE>
</MST_GEOGRAPHY>
<MST_GEOGRAPHY >
               <GEOGRAPHY_TITLE>hi</GEOGRAPHY_TITLE>
               <GEOGRAPHY_ID>5a7a24ec-93ff-8be6-7ef9-fa021500df0e</GEOGRAPHY_ID>
               <TENANT_ID>{0559cdcb-c63b-4c81-be91-b78e831bf5a5}</TENANT_ID>
               <ACTIVE>1</ACTIVE>
</MST_GEOGRAPHY>
</MST>
4

2 回答 2

1

contains()可以在不使用但仅通过严格比较的情况下选择想要的元素——像这样:

//*/text()[1][. = concat("APAC > Andaman Islands > test&'<,\", '"123')]

说明

请注意标准 XPath 函数的使用,concat()以便可以使用引号或撇号来包围不包含它们的字符串部分——并将字符串的这些部分连接成完整的字符串。

注意:此解决方案仅使用纯 XPath 1.0。

于 2015-04-03T04:21:10.910 回答
0

这可能是一种风格,但我可能会将您的 XPath 重写为:

//*:GEOGRAPHY_TITLE[contains(., "APAC > Andaman Islands > test&'<,")][contains(., '"123')]

以这种方式,元素的选择是绝对的和静态的,而不是对local-name功能的评估,这应该证明更有效。由于您已经熟悉使用多个谓词作为AND约束的一种方式,因此对我来说,将多个谓词用于包含而不是“和”关键字似乎是明智的。通常(但并非总是)如果您首先放置选择性最高的谓词,您会看到比放置选择性最少的谓词更好的性能。

于 2014-12-23T12:42:29.267 回答