【问题标题】:Sort with XPath - Not XSL使用 XPath 排序 - 不是 XSL
【发布时间】:2011-12-12 20:53:03
【问题描述】:

在 XPath DOM 编程中有什么方法可以使用 System.Xml 运行带有排序参数的 selectNodes (XPATH)?

例如,使用以下 XML 和程序以与文档相同的顺序(降序)写入值。有没有办法使用 XPath 以升序获取值?

注意。当然,您可以在 XSL 中预先排序,但是我需要在循环时更新这些值。由于 XSL 为我提供了元素的排序副本不是实际的元素本身,我不能使用 XSL。

这是一些 XML,一个程序输出

public static void Main() {

        XmlDocument xml = new XmlDocument();
        xml.Load( "t.xml" );

        // SelectNodes gets in document order, but I want in 
            // ascending order based on @value
        foreach( XmlNode ndNode in xml.SelectNodes( "/xml/ele" ) ) {
            Console.WriteLine( ndNode.Attributes["value"].Value );
        }
    }

这是 XML

<xml>
<ele value='3' test='Third'/>
<ele value='2' test='Second'/>
<ele value='1' test='First'/>
</xml>

最后以文档(降序)顺序输出。我想要一个按升序返回节点的 XPath。

3
2
1

PS,我在 Visual Studio 2008 .NET 3.5 中使用 System.Xml

【问题讨论】:

  • 从您的示例中,我看不出为什么 XSL 不适合您。原始元素到底是什么意味着您必须修改它们?
  • XPath 2.0 有一个reverse 函数。
  • 嗨,保罗,澄清一下,我需要更新循环中的元素。当我迭代每个元素时,都包含一个有效日期和到期日期。我需要按生效日期排序的元素,并将到期日期设置为下一个生效日期。当然,我想这可以通过输出文档的副本在 XSL 中完成,但我正在寻找一种更有效的方法。
  • 更改节点对其他地方有影响吗?例如其他一些对象持有指向节点的指针,并且更改值会更改其他一些对象的行为。如果没有,那么您不需要修改原始元素。如果您正在加载、更改和保存文档,则保存的文档与 XSL 转换的输出一样不是原始文档。
  • 你说得对,Paul,这可以在 XSL 中完成。我过去就是这样做的。我只是在寻找另一种方式。

标签: c# xml xpath


【解决方案1】:

XPath 不支持排序,但是您可以查看@987654321@ 方法。

【讨论】:

  • Wojteq,感谢另一种解决此问题的方法。似乎比 LINQ 干净一点。
【解决方案2】:

不,没有办法单独在 XPath 中进行排序。

但是您可以轻松地使用 LINQ 按您想要的任何值对节点集合进行排序。

XmlDocument xml = new XmlDocument ();
xml.LoadXml("<xml> <ele value='3' test='Third'/> <ele value='2' test='Second'/> <ele value='1' test='First'/> </xml>");
var nodes = xml.SelectNodes( "/xml/ele" ).Cast<XmlNode>().OrderBy(ndNode => ndNode.Attributes["value"].Value);

【讨论】:

  • 有趣,但 LINQ 不只是用于将 SQL 数据集转换为 XML 吗?我的 XML 不在数据库中。
  • 没有。您谈论的是 LINQ 功能的子集 LINQ-to-SQL。如果您想坚持使用 XmlDocument,我已经添加了如何获取所需节点集合的示例。您可能还想考虑 LINQ-to-XML (XDocument,...)。
  • 感谢 Alexi,LINQ 看起来像个赢家。感谢您引起我的注意。
  • 错了。 XPath 2.0 可以排序(证明:ximeco.org/Xime/XPathCanSortHlousek.pdf)。使用 XPath 3.0,它变得高效而简单。
  • @SeanB.Durkin 当然。请注意,问题是“使用 System.Xml”,这意味着 OP 仅限于 XPath 1.0。
【解决方案3】:

对于以后遇到这个问题的人来说,XPath 3.1 有一个排序功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2012-11-19
    • 2023-03-14
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多