【问题标题】:Get xml node with last date获取具有最后日期的 xml 节点
【发布时间】:2012-03-19 06:58:39
【问题描述】:

我有下一个 xml:

<Histories>
    <History>
        <Date>20.06.2010</Date>
        <FileName>4.txt</FileName>
    </History>
    <History>
        <Date>05.06.2012</Date>
        <FileName>2.txt</FileName>
    </History>
    <History>
        <Date>18.12.1999</Date>
        <FileName>3.txt</FileName>
    </History>
</Histories>

我需要按日期获取最后一个节点(设置 XPath 女巫返回日期)。我能怎么做?示例:2.txt

谢谢

【问题讨论】:

  • >/Histories/History[ not( (preceding-sibling::History | following-sibling::History)/Date > Date ) ] 不适用于我的组合日期
  • 确实如此。仅在 XPath 1.0 中使用日期格式是不可能做到这一点的。提供的替代方案有:XPath 2.0、LINQ to XML、XSLT 和 XQuery。

标签: .net xml xpath


【解决方案1】:

在 XPath 2.0 中,您可以这样做:

/Histories/History[
    concat(substring(Date,7),substring(Date,4,2),substring(Date,1,2)) =
    max(/Histories/History/concat(substring(Date,7),substring(Date,4,2),
        substring(Date,1,2)))
]

第一部分 (concat(...)) 将日期转换为 YYYYMMDD 格式以允许排序。然后它将它与文件中的最大此类值进行比较。

这在 XPath 1.x 中是不可能的,因为没有 max() 函数,也不能在路径末尾调用函数 (/Histories/History/concat(...))。

.NET 本身不支持 XPath 2.0,但 there are libraries that add this

【讨论】:

  • +1。如果 OP 有有用的日期格式,这在 XPath 1.0 中会非常简单。我添加了一个“if only”解决方案。
【解决方案2】:

如果您的 XML 中有正确的日期(yyyyddmm 而不是 dd.mm.yyyy),则此 XPath 1.0 可以工作:

/Histories/History[
  not(
    (preceding-sibling::History | following-sibling::History)/Date > Date
  )
]

由于您的日期错误,XPath 1.0 无法做到这一点。

【讨论】:

    【解决方案3】:

    这不是 WPF 特有的。

    您是否尝试过为此使用XQueryXLinq

            var element = XElement.Parse(<yourXml>);
            var lastDateHistoryNode
                  = element.XPathSelectElements("//History").OrderByDescending(
                       e => DateTime.ParseExact(
                              e.Element("Date").Value, "dd.MM.yyyy", null)).First();
            var lastDateFileName = lastDateHistoryNode.Element("FileName").Value;
    

    【讨论】:

      【解决方案4】:

      XPath 本身不允许您从有序列表中进行选择。如果您可以先使用 XSLT(特别是 &lt;xsl:sort&gt;)来获得排序的节点集,那么选择第一个或最后一个元素是微不足道的(nodeset[1]nodeset[last()]

      要按时间顺序对日期进行排序,最好先将它们转换为 ISO (YYYY-MM-DD),因为字符串顺序与时间顺序一致。

      【讨论】:

      • XPath 不允许您从有序列表中进行选择,但是有一些方法可以从节点集中获取最小值/最大值 - 只要值自然排序(dd.mm.yyyy 不会这样做,不幸的是)。
      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      相关资源
      最近更新 更多