请教:怎样对XML文件中查询的所有记录按某个属性进行排序。 请做过这方面的高手指教,希望您能提供示例代码。先谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 例如XML文件如下:<?xml version="1.0" standalone="yes"?><BaseLog> <Info> <rq>2006-5-13</rq> <memo><![CDATA[第五个阶段已经倒的差不多了。]]></memo> <User>高级管理者</User> </Info> <Info> <rq>2006-5-14</rq> <memo><![CDATA[已经挂了4对索。还在做第5个阶段]]></memo> <User>高级管理者</User> </Info> <Info> <rq>2006-5-15</rq> <memo><![CDATA[今天带望远镜去看了一下,从下游方向看,发现第5个阶段还没有倒完。]]></memo> <User>高级管理者</User> </Info> <Info> <rq>2006-5-18</rq> <memo><![CDATA[第5个阶段开始挂索了!]]></memo> <User>高级管理者</User> </Info> <Info> <rq>2006-5-22</rq> <memo><![CDATA[第五个阶段终于做完。18点30分观察的时候,已经开始拆卸夹板。]]></memo> <User>高级管理者</User> </Info></BaseLog>用来控制显示的xsl文件如下,按照时间排序<?xml version="1.0" encoding="utf-8" ?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="BaseLog"> <xsl:for-each select="Info"> <xsl:sort select="rq" order="descending"/> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr class="color1" height="25"> <td width="20">				</td> <td width="410"> <font color="#3366CC"> <b> <xsl:element name="a"> <xsl:attribute name="target">_blank</xsl:attribute> <font color="#3366CC"> <xsl:value-of select="User" />(<xsl:value-of select="rq"/>) </font> </xsl:element> </b> </font> </td> </tr> <tr> <td bgcolor="#0066CC" height="1" colspan="4"></td> </tr> <tr> <td colspan="4" height="5"></td> </tr> <tr> <td> <font color="#ffffff"> </font> </td> <td colspan="3"> <xsl:apply-templates select="memo" /> </td> </tr> <tr> <td height="10" align="right" colspan="4"> <font color="#FF6633"> <b> <a href="#top"> <font color="#3366CC">Top</font> </a> </b> </font> </td> </tr> </table> </xsl:for-each> </xsl:template> <xsl:template match="memo"> <table width="100%" cellpadding="3"> <tr> <td> <xsl:element name="textarea"> <!-- <xsl:attribute name="class">memo</xsl:attribute> --> <xsl:attribute name="readonly">true</xsl:attribute> <xsl:attribute name="cols">70</xsl:attribute> <xsl:attribute name="rows">5</xsl:attribute> <xsl:apply-templates /> </xsl:element> </td> </tr> </table> </xsl:template></xsl:stylesheet>设置两个文件的关联后,就看到效果了。 在XML文件上加入这一句<?xml-stylesheet type='text/xsl' href='/expert/Xsl/2.xsl'?>上面的2.xsl就是上面示例代码中xsl文件的名字。你可以参看csdn这些帖子的源吗。 使用XPathExpression类对XML进行排序如果你曾经使用过XSLT,当你需要对XML文档中的字符串或数字进行排序时,你可能会习惯于使用xsl:sort元素,在进行xsl:for-each进行循环或用xsl:apply-templates调用模板时,这个元素的功能很方便,而且简单。然而,在某些情况下,你只是想简单对XML文档进行简单的排序和显示数据,那么xsl:sort就会大大降低计算机性能,下面就解释一下,如何在不使用xsl:sort元素的情况下,实现对XML数据进行排序。 在.NET平台下,要完成这样的工作非常轻松,我们只需使用System.Xml.XPath名字空间里的几个类即可,如XPathNavigator和XPathExpression。这些类相当于XSLT中XPath的功能,允许你在XML文档中进行遍历,也可以进行排序的操作。下面是对System.Xml.XPath名字空间中的类进行的简单的描述: XPathDocument:进行XML文档处理时,提供一个快速、有效的、只读的Cache功能,在进行XSLT转换时,推荐使用该类。 XPathException:当处理XPath产生错误时,抛出一个例外。 XPathExpression:保存在调用XPathNavigator的Compile()方法时生成的、经过编译的XPath表达式。 XPathNavigator:提供一个指针模型,供我们读取支持IXPathNavigable接口的所保存的任何类型的数据。 XPathNodeIterator:遍历节点集合。 由于要详细讨论每一个类的细节,超出了我们主题的范围,我们只讨论与排序有关的那些类的使用。首先,我们需要创建一个XPathNavigator对象,以便建立XPath表达式来完成我们的排序功能。由于这个类是一个抽象类,我们不能这样直接创建它: XPathNavigator nav = new XPathNavigator();我们必须使用XmlDocument、XmlDataDocument或XPathDocument的CreateNavigator()方法来创建: XPathDocument doc = new XPathDocument(Server.MapPath("customers.xml")); XPathNavigator nav = doc.CreateNavigator();创建了XPathNavigator对象后,我们就可以使用Compile()方法编译一个XPath表达式,这个方法返回一个XPathExpression 类,它封装编译过的表达式,同时允许我们进行排序。下面是一个使用XPathNavigator类创建一个编译过的XPath表达式的例子: XPathExpression exp = nav.Compile(xpath);我们通过使用XPathExpression对象的AddSort()方法实现排序的功能,这个方法有两个重载的方式: public abstract void AddSort(object expr, IComparer comparer); public abstract void AddSort( object expr, XmlSortOrder order, XmlCaseOrder caseOrder, string lang, XmlDataType dataType );第一个方法允许我们使用自定义的排序表达式;第二个方法有5个参数:分别是要排序的对象、排序顺序、条件顺序、语言类别和数据类型,下面就是使用该方法进行排序的例子: exp.AddSort("text()",XmlSortOrder.Ascending,XmlCaseOrder.None,"",XmlDataType.Text);一旦我们对XPath表达式添加了排序的功能,我们就可以调用XPathNavigator对象的Select()方法,并把编译过的XPath表达式作为参数,Select()方法返回一个XPathNodeIterator对象,我们可以使用它遍历我们所选择的节点。 下面就是用C#编写的实现排序功能的所有代码: private void Page_Load(object sender, System.EventArgs e) { StringBuilder unsorted = new StringBuilder(); StringBuilder sorted = new StringBuilder(); string xpath = "/Customers/Customer/ContactName"; XPathDocument doc = new XPathDocument(Server.MapPath("customers.xml")); XPathNavigator nav = doc.CreateNavigator(); XPathNodeIterator nodeIter1 = nav.Select(xpath); while (nodeIter1.MoveNext()) { unsorted.Append(nodeIter1.Current.value + "<br />"); } this.lblUnsorted.Text = unsorted.ToString(); XPathExpression exp = nav.Compile(xpath); exp.AddSort("text()",XmlSortOrder.Ascending, XmlCaseOrder.None,"",XmlDataType.Text); XPathNodeIterator nodeIter2 = nav.Select(exp); while (nodeIter2.MoveNext()) { sorted.Append(nodeIter2.Current.value + "<br />"); } this.lblSorted.Text = sorted.ToString(); } 最好自己写函数来实现,在msxml中没有这样的函数 wise打包时取得的路径是以\隔开的,怎么把\转换成/ 在主线程中创建多个线程,如何在主线程中判断所有线程已经运行完毕? 今天心情好 新年了,也散点分庆祝一下~~~~~ 怎么锁定桌面 Delphi 2005-06专家榜 關於DateTimePicker的問題求助 使用FINDWINDOW()返回错误 未声明 如何将TEdit统一一次赋值 SELECT 语句返回值是什么类型???? *.exe - 无法找到入口(关于netapi32.dll的问题) 使用IdHTTP1.Get('http://www.xxx.com')一次,算不算打开www.xxx.com网页一次
<?xml version="1.0" standalone="yes"?>
<BaseLog>
<Info>
<rq>2006-5-13</rq>
<memo><![CDATA[第五个阶段已经倒的差不多了。]]></memo>
<User>高级管理者</User>
</Info>
<Info>
<rq>2006-5-14</rq>
<memo><![CDATA[已经挂了4对索。还在做第5个阶段]]></memo>
<User>高级管理者</User>
</Info>
<Info>
<rq>2006-5-15</rq>
<memo><![CDATA[今天带望远镜去看了一下,从下游方向看,发现第5个阶段还没有倒完。]]></memo>
<User>高级管理者</User>
</Info> <Info>
<rq>2006-5-18</rq>
<memo><![CDATA[第5个阶段开始挂索了!]]></memo>
<User>高级管理者</User>
</Info>
<Info>
<rq>2006-5-22</rq>
<memo><![CDATA[第五个阶段终于做完。18点30分观察的时候,已经开始拆卸夹板。]]></memo>
<User>高级管理者</User>
</Info>
</BaseLog>
用来控制显示的xsl文件如下,按照时间排序
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="BaseLog">
<xsl:for-each select="Info">
<xsl:sort select="rq" order="descending"/>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr class="color1" height="25">
<td width="20">				</td>
<td width="410">
<font color="#3366CC">
<b>
<xsl:element name="a"> <xsl:attribute name="target">_blank</xsl:attribute>
<font color="#3366CC">
<xsl:value-of select="User" />(<xsl:value-of select="rq"/>)
</font>
</xsl:element>
</b>
</font>
</td>
</tr>
<tr>
<td bgcolor="#0066CC" height="1" colspan="4"></td>
</tr>
<tr>
<td colspan="4" height="5"></td>
</tr>
<tr>
<td>
<font color="#ffffff"> </font>
</td>
<td colspan="3">
<xsl:apply-templates select="memo" />
</td>
</tr>
<tr>
<td height="10" align="right" colspan="4">
<font color="#FF6633">
<b>
<a href="#top">
<font color="#3366CC">Top</font>
</a>
</b>
</font>
</td>
</tr> </table>
</xsl:for-each>
</xsl:template>
<xsl:template match="memo">
<table width="100%" cellpadding="3">
<tr>
<td>
<xsl:element name="textarea">
<!-- <xsl:attribute name="class">memo</xsl:attribute>
-->
<xsl:attribute name="readonly">true</xsl:attribute>
<xsl:attribute name="cols">70</xsl:attribute>
<xsl:attribute name="rows">5</xsl:attribute>
<xsl:apply-templates />
</xsl:element>
</td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
设置两个文件的关联后,就看到效果了。
<?xml-stylesheet type='text/xsl' href='/expert/Xsl/2.xsl'?>上面的2.xsl就是上面示例代码中xsl文件的名字。
你可以参看csdn这些帖子的源吗。
XPathDocument:进行XML文档处理时,提供一个快速、有效的、只读的Cache功能,在进行XSLT转换时,推荐使用该类。 XPathException:当处理XPath产生错误时,抛出一个例外。 XPathExpression:保存在调用XPathNavigator的Compile()方法时生成的、经过编译的XPath表达式。 XPathNavigator:提供一个指针模型,供我们读取支持IXPathNavigable接口的所保存的任何类型的数据。 XPathNodeIterator:遍历节点集合。 由于要详细讨论每一个类的细节,超出了我们主题的范围,我们只讨论与排序有关的那些类的使用。首先,我们需要创建一个XPathNavigator对象,以便建立XPath表达式来完成我们的排序功能。由于这个类是一个抽象类,我们不能这样直接创建它:
XPathNavigator nav = new XPathNavigator();我们必须使用XmlDocument、XmlDataDocument或XPathDocument的CreateNavigator()方法来创建:
XPathDocument doc = new XPathDocument(Server.MapPath("customers.xml"));
XPathNavigator nav = doc.CreateNavigator();创建了XPathNavigator对象后,我们就可以使用Compile()方法编译一个XPath表达式,这个方法返回一个XPathExpression 类,它封装编译过的表达式,同时允许我们进行排序。下面是一个使用XPathNavigator类创建一个编译过的XPath表达式的例子:
XPathExpression exp = nav.Compile(xpath);我们通过使用XPathExpression对象的AddSort()方法实现排序的功能,这个方法有两个重载的方式: public abstract void AddSort(object expr, IComparer comparer);
public abstract void AddSort(
object expr,
XmlSortOrder order,
XmlCaseOrder caseOrder,
string lang,
XmlDataType dataType
);第一个方法允许我们使用自定义的排序表达式;第二个方法有5个参数:分别是要排序的对象、排序顺序、条件顺序、语言类别和数据类型,下面就是使用该方法进行排序的例子:
exp.AddSort("text()",XmlSortOrder.Ascending,XmlCaseOrder.None,"",XmlDataType.Text);一旦我们对XPath表达式添加了排序的功能,我们就可以调用XPathNavigator对象的Select()方法,并把编译过的XPath表达式作为参数,Select()方法返回一个XPathNodeIterator对象,我们可以使用它遍历我们所选择的节点。 下面就是用C#编写的实现排序功能的所有代码:
private void Page_Load(object sender, System.EventArgs e) {
StringBuilder unsorted = new StringBuilder();
StringBuilder sorted = new StringBuilder();
string xpath = "/Customers/Customer/ContactName";
XPathDocument doc = new XPathDocument(Server.MapPath("customers.xml"));
XPathNavigator nav = doc.CreateNavigator();
XPathNodeIterator nodeIter1 = nav.Select(xpath);
while (nodeIter1.MoveNext()) {
unsorted.Append(nodeIter1.Current.value + "<br />");
}
this.lblUnsorted.Text = unsorted.ToString();
XPathExpression exp = nav.Compile(xpath);
exp.AddSort("text()",XmlSortOrder.Ascending,
XmlCaseOrder.None,"",XmlDataType.Text);
XPathNodeIterator nodeIter2 = nav.Select(exp);
while (nodeIter2.MoveNext()) {
sorted.Append(nodeIter2.Current.value + "<br />");
}
this.lblSorted.Text = sorted.ToString();
}