使用 XPath 获取子元素值,其中日期是元素值

Posted

技术标签:

【中文标题】使用 XPath 获取子元素值,其中日期是元素值【英文标题】:Getting sub element value using XPath where date is the element value 【发布时间】:2021-02-18 12:37:25 【问题描述】:

鉴于此示例 xml

<?xml version="1.0" encoding="UTF-8"?>
<currencies>
  <currency value="gbp">
   <Date>11/5/2020</Date>
   <Close>1.3102</Close>
 </currency>
 <currency value="gbp">
   <Date>11/4/2020</Date>
   <Close>1.2988</Close>
 </currency>
 <currency value="gbp">
   <Date>11/3/2020</Date>
   <Close>1.3049</Close>
 </currency>
</currencies>

我可以使用货币获取所有节点

var xpath = $"//currencies//currency[@value='currency']";
var nodes = doc.XPathSelectElements(xpath);

但我无法正确获取按日期获取节点的语法

 //priceDate is a DateTime passed in
 //this produces this xpath --- //currencies//currency[@value='gbp'] 
 [Date[text()] =09/15/2015]
 var xpath = $"//currencies//currency[@value='currency'][Date[text()] =priceDate:MM/dd/yyyy]";
 var node = doc.XPathSelectElement(xpath);

任何帮助表示赞赏。 我最终也想在 xpath 中检索收盘价。

【问题讨论】:

【参考方案1】:

您需要注意日期格式。带前导零或不带...

按日期选择货币元素:

/currencies/currency[Date='11/4/2020']

按日期选择关闭元素:

/currencies/currency[Date='11/4/2020']/Close

【讨论】:

@YitzhakKhabinsky 我已经试过这个 var xpath = $"//currencies//currency[@value='currency'][Date ='priceDate:MM/dd/yyyy'] ";但它产生一个空结果,我验证了 xml 在文件中 并且生成的 XPath 字符串看起来与您在回答中注明的完全相同(包括属性)//currencies//currency[@value='gbp'][Date ='09/15/2015' ] 我发现了问题...例如 priceDate 变量转换为 09/15/2015,但文件的日期为 9/15/2015。从月份和日期中删除前导 0 的货币格式是什么 @dinotom,我从一开始就在回答中提到了零。 @YitzhakKhabinsky 是的,这就是我回去检查它的原因。此 XPath 现在正在运行 $"//currencies//currency[@value='currency'][Date ='priceDate:M/d/yyyy']//Close"

以上是关于使用 XPath 获取子元素值,其中日期是元素值的主要内容,如果未能解决你的问题,请参考以下文章

XML 使用 SelectNodes 来获取具有空值子节点的节点

XPath 获取除具有特定名称的子元素之外的所有子元素?

xpath按元素和属性查找节点,其中包含具有特定id的子元素

使用xpath提取页面所有a标签的href属性值

xpath 通过包含值的父属性排除元素及其所有子元素

通过xpath 1.0分别选择子元素elem