使用XPathExpression類對XML進行排序 (轉)

worldblog發表於2007-12-12
使用XPathExpression類對XML進行排序 (轉)[@more@]

使用Expression類對進行排序

.NET_lover

 如果你曾經使用過T,當你需要對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 e= nav.Compile(xpath);
 
 我們透過使用XPathExpression物件的AddSort()方法實現排序的功能,這個方法有兩個過載的方式:
 
 public abstract void AddSort( 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物件的()方法,並把編譯過的XPath表示式作為引數,Select()方法返回一個XPathNodeIterator物件,我們可以使用它遍歷我們所選擇的節點。
 下面就是用編寫的實現排序功能的所有程式碼:
 
 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 + "
");
 }
 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 + "
");
 } 
 this.lblSorted.Text = sorted.ToString();
 }

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992091/,如需轉載,請註明出處,否則將追究法律責任。

相關文章