【发布时间】: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 中完成。我过去就是这样做的。我只是在寻找另一种方式。