我有一个包含开始日期和结束日期的日期范围(期间)的XML列表。我需要查询列表并在找到匹配时返回Start元素(或位置),但我不确定如何实现此目的。
以下是示例数据:
<Calendar>
<Period>
<Start>20150501</Start>
<End>20150514</End>
</Period>
<Period>
<Start>20150515</Start>
<End>20150531</End>
</Period>
<Period>
<Start>20150601</Start>
<End>201506014</End>
</Period>
<Period>
<Start>20150615</Start>
<End>201506030</End>
</Period>
<Calendar>
我已经使用这个XPATH来查找我的输出,但是如何返回Start的元素值或者可能返回Position?
//Calendar/Period[Start <= '20150518' and End >= '20150518']
返回:
/Calendar[1]/Period[2]
我正在寻找输出为Start值或Position:来自我的示例'20150515'或2。
XML是来自Web服务调用的响应,因此我无权访问文件。
谢谢!
答案 0 :(得分:1)
这是半个答案,依赖于ubuntu的xmllint
。
xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start/text()'
返回
20150515
但最后不会有\n
个字符。这意味着您的cmd行看起来像
20150515mPrompt >
(另请注意,当您实际指定完整路径时,在前面使用&#39; //&#39;通常会被真正的XMLSLT大师标记为SO,因为计算成本高且不需要。我有切换到/Calendar/...
。并且不需要引用日期值,因此只需要20150518
,而不是'20150518'
(至少在xmllint
中)。
我花了太多时间研究正确的语法来追加\n
但却找不到它。我想这种行为被认为是XML-land中的一个特性。显然唯一的解决方案是黑客攻击。 IHMO,最容易理解的是
xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start' \
| sed 's@<[/]*Start>@@g;s/$/\n/'
生成
20150518
(我在一台机器上写这个并在另一台机器上测试)。
最后,如果,A。您在* nix shell脚本环境中执行此操作,并且您希望稍后使用该值,那么最简单的方法是使用cmd-substitution来捕获值进入shell变量,比如
startDate=$(xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start/text()')
echo "my StartDate = ${startDate}'
my StartDate = 20150518
至于返回位置,我无法找到适用于xmllint的xpath函数。基于XML Cheetsheet的功能列表,我原本希望
xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start/position()'
工作,但只有
XPath error : Invalid expresion
xmlpathEval : evaluation failed
XPath evaluation failure
欢迎其他人解释!
IHTH
答案 1 :(得分:-1)
您可以将XPATH用于此//Period[Start >= 20150501 and End <= 20150514]
试一试here