给定键值的XPath?

问题描述

我从下面创建了一个 XML 对象:

<?xml version="1.0" encoding="UTF-8"?>
<pdfDoc>
  <XMLOutput>
    <webservice>
      <residentLocationData>
        <addressDataMap>
          <entry>
            <key>Zip</key>
            <value>08094</value>
          </entry>
          <entry>
            <key>CountyCode</key>
            <value>015</value>
          </entry>
          <entry>
            <key>StateName</key>
            <value>New Jersey</value>
          </entry>
        </addressDataMap>
      </residentLocationData>
    </webservice>
  </XMLOutput>
<pdfDoc>

我正在尝试提取“New Jersey”的字符串值。要获取“值”元素本身,我正在使用:

//addressDataMap/entry/key[text() = 'StateName']/following-sibling::value

但我还没有在网上看到任何说明如何仅使用 XPath 本身获取该元素的 xmlText 字符串值的内容。我可以使用我正在使用的语言 (Coldfusion) 中的代码获取该字符串:

<cfset theState = xmlSearch(L.xmlObj,"//addressDataMap/entry/key[text() = 'StateName']/following-sibling::value")[1].xmlText>

但我不清楚如何仅使用 XPath 获取字符串“New Jersey”。

解决方法

这个 XPath,

//entry[key='StateName']/value/text()

将根据要求选择与 "New Jersey" value 关联的 'StateName' key

,

//addressDataMap/entry/key[text() = 'StateName']/following-sibling::value/text()

string(//addressDataMap/entry/key[text() = 'StateName']/following-sibling::value)

应该可以。

,

尝试使用

//addressDataMap/entry[key/text()='StateName']/value/text()

它应该给你字符串“New Jersey”。

,

我已经尝试了建议的 Xpath。使用以“/text()”结尾的那些,我得到的不是一个字符串,而是一个包含三个 kv 对的结构的单元素数组:

XmlName = #text
XmlType = TEXT
XmlValue = New Jersey

这可能是因为我使用了 Coldfusion 函数 xmlSearch()。这应该返回与 XPath 表达式将返回的数据类型相同的数据类型,但在这种情况下可能不是。不过没关系。很容易得到一个字符串:

<cfset strState = xmlSearch(L.xmlObj,"//workLocationData/addressDataMap/entry[key/text() = 'StateName']/value/text()")[1].xmlValue>

这比我之前使用的“following-sibling”要好,以防万一“value”元素出现在其兄弟“key”元素之前。