【问题标题】:Convert an XpathNodeIterator to a List<XElement>将 XpathNodeIterator 转换为 List<XElement>
【发布时间】:2015-04-16 18:53:39
【问题描述】:

在 C# 中,我使用 XpathExpression 和字段发布日期的自定义比较函数对 RSS 提要进行排序。

我需要将此已排序的 XPathNodeIterator 对象转换为 List&lt;XElement&gt; 'Generic Linq type' 对象。我尝试使用中间数据类型,但没有任何运气。

试过了:

List<XElement> elements = new List<XElement>();
IEnumerable<XElement> sortedElements;
IEnumerable<XElement> newElements;

sortedElements = (IEnumerable <XElement>) iterator;

我也尝试在列表中使用 order by,但仅使用 List&lt;XElement&gt; 并不成功。

【问题讨论】:

    标签: c# list xelement xpathnodeiterator


    【解决方案1】:

    由于这是IEnumerable,转换为IEnumerable&lt;&gt; 的最简单方法是使用OfType,如下所示:

    var sortedElements = iterator.OfType<XPathNavigator>();
    

    这不会给你XElement对象;这是单独的 XML API 的一部分。但是,XPathNavigator 对象可能包含您需要的数据,因此您可以根据需要跟进某种 Select

    var elementValues = iterator.OfType<XPathNavigator>().Select(n => n.Value);
    

    如果您确实想使用System.Linq.Xml 的东西,您可以将您的XPath 重写为XDocument 上的LINQ。

    【讨论】:

    • 不幸的是我不能使用 XPathNavigator。我必须重写我的排序功能。 'var doc = XDocument.Load(url);' 'elements.AddRange(doc.XPathSelectElements(_xpath).ToList()); ' 这就是生成 List 的方式。不是我的代码,无法更改。我将不得不运行排序比较方法或新的排序功能。但我对 Linq 不熟悉。
    • 如果我使用'sortElement = elements.OrderBy(element => element.Element("pubDate").Value);'我收到错误消息无法将类型“System.Linq.IOrderedEnumerable”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?
    • 您必须将值分配给List&lt;XElement&gt;。如果你真的需要它是一个列表,你可以在你的.OrderBy()之后添加一个.ToList()
    • 谢谢。这似乎摆脱了错误。是的,不幸的是它必须是一个列表。 OrderBy 没有对列表进行排序。我猜这是因为 pubDate 的实际值是一个字符串 Fri, DD Month YYYY HH:MM:SS -XXXX。并且类型转换为 int 将是无效和不正确的。
    【解决方案2】:

    我知道这个问题很老,但你检查过它是否有效吗?

    var xmlStrings = iterator.OfType<XPathNavigator>().Select(n => n.OuterXml).ToList();
    var xmlElements = new List<XElement>();
    xmlStrings.ForEach(el => xmlElements.Add(XElement.Parse(el)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2014-08-27
      相关资源
      最近更新 更多