xPath Expression v1.0 [迭代器,如果有的话]
xPath Expression v1.0 [iterator if any]
比特努力循环遍历元素名称的动态出现并提取相应的值。
我正在尝试直接 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()
直接select个文本节点。
用 |
等分隔符连接这些结果不应在 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 serialization/parsing 配置(主要是关于缩进和仅保留空白文本节点)您可以使用此 XPath 表达式:
translate(normalize-space(/myXMLNode/temperatureInCelsius),' ','|')
结果:
2013-06-01|2013-06-30|2013-07-01
在 here
中测试
比特努力循环遍历元素名称的动态出现并提取相应的值。 我正在尝试直接 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()
直接select个文本节点。
用 |
等分隔符连接这些结果不应在 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 serialization/parsing 配置(主要是关于缩进和仅保留空白文本节点)您可以使用此 XPath 表达式:
translate(normalize-space(/myXMLNode/temperatureInCelsius),' ','|')
结果:
2013-06-01|2013-06-30|2013-07-01
在 here
中测试