为了在元素名称的动态出现中循环并提取相应的值而苦苦挣扎的位。我正在尝试直接使用xPath表达式。
我的xml看起来像:
<myXMLNode>
<sunnyDay>YES</sunnyDay>
<snowing>NO</snowing>
<temperatureInCelsius>
<Date>2013-06-01</Date>
<Date>2013-06-30</Date>
<Date>2013-07-01</Date>
</temperatureInCelsius>
</myXMLNode>
我要提取所有可用的具有分隔符的Date元素值,这些值用竖线分隔,并且该值不断变化(目前,在上面的示例中为3个日期)示例输出:2013-06-01 | 2013-06-30 | 2013-07-01
我在下面尝试过但没有运气:
1. concat(//myXMLNode/temperatureInCelsius/Date[1], "_" ,//myXMLNode/temperatureInCelsius/Date[2], "_" ,//myXMLNode/temperatureInCelsius/Date[3])
2. //myXMLNode/temperatureInCelsius/Date[position()>0 or position()<=count(myXMLNode/temperatureInCelsius/Date)
3. //myXMLNode/temperatureInCelsius/Date[position()>0 and position()<=count(myXMLNode/temperatureInCelsius/Date)
检索所有相关字符串的正确XPath表达式是
/myXMLNode/temperatureInCelsius/Date
或可能
/myXMLNode/temperatureInCelsius/Date/text()
直接选择文本节点。
不要用诸如|
之类的分隔符将那些结果连接起来,而不是在XPath中,而是在您使用的宿主语言或环境中进行。例如,这很容易在Python中完成:
>>> from lxml import etree
>>> document_string = """<myXMLNode>
... <sunnyDay>YES</sunnyDay>
... <snowing>NO</snowing>
... <temperatureInCelsius>
... <Date>2013-06-01</Date>
... <Date>2013-06-30</Date>
... <Date>2013-07-01</Date>
... </temperatureInCelsius>
... </myXMLNode>"""
>>> root = etree.fromstring(document_string)
>>> dates = root.xpath("/myXMLNode/temperatureInCelsius/Date/text()")
>>> dates
['2013-06-01', '2013-06-30', '2013-07-01']
>>> "|".join(dates)
'2013-06-01|2013-06-30|2013-07-01'
在XPath 1.0中,没有序列或节点集字符串值操作(即XPath 2.0+中的string-join()
)。
因此,如果您不希望像concat(date[1],'|',date[2])
这样的固定连接,并且可以轻松地依靠XML序列化/解析配置(主要是关于缩进和仅保留空白文本节点),则可以使用此XPath表达式:
translate(normalize-space(/myXMLNode/temperatureInCelsius),' ','|')
结果:
2013-06-01|2013-06-30|2013-07-01
在here中测试