XPath选择带有多个字符串的OR

时间:2015-03-20 18:11:43

标签: xml xpath

我有以下XML需要获得DESCR的所有产品“30年固定利率”,“15年固定利率”和“双周30年固定利率”。

<FEATURED_RATES>
<RATE_UPLOAD_DATE>03/19/2015 11:22 AM CT</RATE_UPLOAD_DATE>
<GROUPS>
    <GROUP>
        <NAME>FIXED RATE PRODUCTS</NAME>
        <PRODUCT>
            <DESCR>30 Year Fixed Rate</DESCR>
            <RATE>3.75</RATE>
            <APR>3.77</APR>
            <POINTS>0</POINTS>
            <PAYMENT_STREAM_URL></PAYMENT_STREAM_URL>
        </PRODUCT>
        <PRODUCT>
            <DESCR>20 Year Fixed Rate</DESCR>
            <RATE>3.625</RATE>
            <APR>3.653</APR>
            <POINTS>0</POINTS>
            <PAYMENT_STREAM_URL>
            </PAYMENT_STREAM_URL>
        </PRODUCT>
        <PRODUCT>
            <DESCR>15 Year Fixed Rate</DESCR>
            <RATE>3</RATE>
            <APR>3.036</APR>
            <POINTS>0</POINTS>
            <PAYMENT_STREAM_URL>
            </PAYMENT_STREAM_URL>
        </PRODUCT>
    </GROUP>
    <GROUP>
        <NAME>BIWEEKLY FIXED RATE PRODUCTS</NAME>
        <PRODUCT>
            <DESCR>Biweekly 30 Year Fixed</DESCR>
            <RATE>3.75</RATE>
            <APR>3.763</APR>
            <POINTS>0</POINTS>
            <PAYMENT_STREAM_URL>
            </PAYMENT_STREAM_URL>
        </PRODUCT>
        <PRODUCT>
            <DESCR>Biweekly 15 Year Fixed</DESCR>
            <RATE>3</RATE>
            <APR>3.031</APR>
            <POINTS>0</POINTS>
            <PAYMENT_STREAM_URL>
            </PAYMENT_STREAM_URL>
        </PRODUCT>
    </GROUP>
</GROUPS>

我按照其他帖子中的建议尝试了,并且单个字符串可以正常工作并带回我期望的信息:

//FEATURED_RATES/GROUPS/GROUP/PRODUCT[DESCR = '30 Year Fixed Rate']

但是我无法在没有错误的情况下获得多个OR语句来返回任何数据:

//FEATURED_RATES/GROUPS/GROUP/PRODUCT[DESCR=('30 Year Fixed Rate') OR DESCR=('15 Year Fixed Rate')]

我收到一条错误消息,指出//FEATURED_RATES/GROUPS/GROUP/PRODUCT[DESCR=('30 Year Fixed Rate') OR DESCR=('15 Year Fixed Rate')]的令牌无效。哪个令牌无效或我的语法不正确?

2 个答案:

答案 0 :(得分:2)

对XPath表达式进行更正:

  1. 将左括号移到各自的开头 表达式。
  2. OR更改为or(小写)。
  3. 共:

    //FEATURED_RATES/GROUPS/GROUP/PRODUCT[(DESCR='30 Year Fixed Rate') or (DESCR='15 Year Fixed Rate')]
    

    然后给出你的XML,上面的XPath表达式将选择

      <PRODUCT>
        <DESCR>30 Year Fixed Rate</DESCR>
        <RATE>3.75</RATE>
        <APR>3.77</APR>
        <POINTS>0</POINTS>
        <PAYMENT_STREAM_URL/>
      </PRODUCT>
    
      <PRODUCT>
        <DESCR>15 Year Fixed Rate</DESCR>
        <RATE>3</RATE>
        <APR>3.036</APR>
        <POINTS>0</POINTS>
        <PAYMENT_STREAM_URL>
        </PAYMENT_STREAM_URL>
      </PRODUCT>
    

    或者,以下 XPath 2.0 表达式也可以使用:

    //FEATURED_RATES/GROUPS/GROUP/PRODUCT[DESCR = ('30 Year Fixed Rate', '15 Year Fixed Rate')]
    

答案 1 :(得分:1)

在这种情况下,无效令牌是OR。它应该是or。字符串值周围的括号是多余的,但它们不是问题。您尝试的正确版本将是:

//FEATURED_RATES/GROUPS/GROUP/PRODUCT[DESCR='30 Year Fixed Rate' or DESCR='15 Year Fixed Rate']

如果必须将DESCR与多个字符串匹配,则必须反复使用DESCR=。在这种情况下你可以使用的替代方案是:

//FEATURED_RATES/GROUPS/GROUP/PRODUCT[DESCR[.='30 Year Fixed Rate' or .='15 Year Fixed Rate']]