Xpath - 如何区分没有属性的节点?

时间:2017-10-30 11:06:46

标签: xpath

我想通过xpath从xml中提取一个值,而且我有点挣扎。这是我必须使用的

的xml示例
<data>
 <menu>
     <date>2017-10-30</date>
     <type>S</type>
     <name>onion soup</name>
 </menu>

 <menu>
     <date>2017-10-30</date>
     <type>L</type>
     <name>ham sandwich</name>
 </menu>

 <menu>
     <date>2017-10-31</date>
     <type>S</type>
     <name>pumpkin soup</name>  
 </menu>

 <menu>
     <date>2017-10-31</date>
     <type>L</type>
     <name>cheese sandwich</name>
 </menu>

 <menu>
      <date>2017-11-1</date>
      <type>S</type>
      <name>sweet potato soup</name>
 </menu>

 <menu>
      <date>2017-11-1</date>
      <type>L</type>
      <name>chicken sandwich</name>
 </menu>
</data>

日期和膳食名称动态变化。

现在我有两列,今天的汤和明天的。我知道如何通过xpath链接到xml今天的汤:

/data/menu/name[../type/text() = "S"]/data/menu[type[text()='S']]/name

但是由于我的xml Feed没有任何属性可以区分,但我在明天会遇到困难,两个日期的类型都是相同的,日期也在不断变化。

感谢您的帮助。

编辑:

感谢您的光临。

我认为我说错了。

我应该指出,我在其中一个本地软件中使用了Xpath内置功能。<​​/ p>

你是对的,这些行

/data/menu[type='S' and date='2017-10-31']]/name

适用于所有的汤,我只是错误地描述了它在我的行为方面的表现,它给了我第一个的价值。

/data/menu[type='S' and date='2017-11-01']]/name

会给我Tommorow的汤,但如果我想在静态栏中使用输出这个值,那么Tommorow的汤&#34;我希望我的xpath输出旁边只有一天是真的。我需要的是它也适用于未来几天。

我需要一条可以给我&#34; tommorow汤&#34;今天假设是南瓜汤,tommorow当xml更新它将是甘薯汤,并且在那之后它将是一些新的汤,将在稍后用整个xml更新。

如果我使用

/data/menu[type='S' and date='2017-10-30']]/name

它不会显示任何东西,因为它不会是2017-10-30因为xml会更新并将从2017-10-31开始。

我希望现在我的问题更加清晰。我知道它仍然令我感到困惑,因此我很难用英语来形容它,特别是因为我是Xath的初学者。

1 个答案:

答案 0 :(得分:1)

如何区分没有属性的元素?使用其他元素......

但首先要澄清一个错误的假设:

  

现在我有2列,今天的汤和明天的。我知道怎么做   通过xpath链接到xml今天的汤:

     

/data/menu/name[../type/text() = "S"]或   /data/menu[type[text()='S']]/name

实际上,你说的XPaths会给你今天的汤,实际上会给你所有汤,而不管date

XPath 1.0

XPath 1.0没有日期函数 1 ,因此您必须将当前日期和明天的日期传递到XPAth,并且您可以自己测试date element的值为字符串:

如果今天是2017年10月31日,那么此XPath将为您提供今天的汤的name

/data/menu[type='S' and date='2017-10-31']]/name

并且此XPath将为您提供明天的汤的name

/data/menu[type='S' and date='2017-11-1']]/name

1 XPath 2.0和3.0的dynamic context包含current-dateTime()函数,但其​​格式为implementation-dependent,这限制了它的用途。您可以使用日期计算来确定明天的日期,但除非您希望依赖于current-dateTime()的实现定义格式,否则至少必须立即通过XPath。