無為

          無為則可為,無為則至深!

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

          如 果你曾經(jīng)使用過XSLT,當(dāng)你需要對(duì)XML文檔中的字符串或數(shù)字進(jìn)行排序時(shí),你可能會(huì)習(xí)慣于使用xsl:sort元素,在進(jìn)行xsl:for-each進(jìn) 行循環(huán)或用xsl:apply-templates調(diào)用模板時(shí),這個(gè)元素的功能很方便,而且簡(jiǎn)單。然而,在某些情況下,你只是想簡(jiǎn)單對(duì)XML文檔進(jìn)行簡(jiǎn)單 的排序和顯示數(shù)據(jù),那么xsl:sort就會(huì)大大降低計(jì)算機(jī)性能,下面就解釋一下,如何在不使用xsl:sort元素的情況下,實(shí)現(xiàn)對(duì)XML數(shù)據(jù)進(jìn)行排 序。?

          在.NET平臺(tái)下,要完成這樣的工作非常輕松,我們只需使用System.Xml.XPath名字空間里的幾個(gè)類即可,如XPathNavigator和 XPathExpression。這些類相當(dāng)于XSLT中XPath的功能,允許你在XML文檔中進(jìn)行遍歷,也可以進(jìn)行排序的操作。下面是對(duì) System.Xml.XPath名字空間中的類進(jìn)行的簡(jiǎn)單的描述:?


          XPathDocument:進(jìn)行XML文檔處理時(shí),提供一個(gè)快速、有效的、只讀的Cache功能,在進(jìn)行XSLT轉(zhuǎn)換時(shí),推薦使用該類。?

          XPathException:當(dāng)處理XPath產(chǎn)生錯(cuò)誤時(shí),拋出一個(gè)例外。?

          XPathExpression:保存在調(diào)用XPathNavigator的Compile()方法時(shí)生成的、經(jīng)過編譯的XPath表達(dá)式。?

          XPathNavigator:提供一個(gè)指針模型,供我們讀取支持IXPathNavigable接口的所保存的任何類型的數(shù)據(jù)。?

          XPathNodeIterator:遍歷節(jié)點(diǎn)集合。?

          由于要詳細(xì)討論每一個(gè)類的細(xì)節(jié),超出了我們主題的范圍,我們只討論與排序有關(guān)的那些類的使用。首先,我們需要?jiǎng)?chuàng)建一個(gè)XPathNavigator對(duì)象,以便建立XPath表達(dá)式來完成我們的排序功能。由于這個(gè)類是一個(gè)抽象類,我們不能這樣直接創(chuàng)建它:?

          ?
          ??XPathNavigator?nav?=?new?XPathNavigator();

          我們必須使用XmlDocument、XmlDataDocument或XPathDocument的CreateNavigator()方法來創(chuàng)建:?

          ??
          ??XPathDocument?doc?=?new?XPathDocument(Server.MapPath("customers.xml"));
          ??XPathNavigator?nav?=?doc.CreateNavigator();

          創(chuàng)建了XPathNavigator對(duì)象后,我們就可以使用Compile()方法編譯一個(gè)XPath表達(dá)式,這個(gè)方法返回一個(gè) XPathExpression?類,它封裝編譯過的表達(dá)式,同時(shí)允許我們進(jìn)行排序。下面是一個(gè)使用XPathNavigator類創(chuàng)建一個(gè)編譯過的 XPath表達(dá)式的例子:?

          ?
          ??XPathExpression?exp?=?nav.Compile(xpath);

          我們通過使用XPathExpression對(duì)象的AddSort()方法實(shí)現(xiàn)排序的功能,這個(gè)方法有兩個(gè)重載的方式:?

          ??public?abstract?void?AddSort(object?expr,?IComparer?comparer);
          ??
          ??public?abstract?void?AddSort(
          ?????object?expr,
          ?????XmlSortOrder?order,
          ?????XmlCaseOrder?caseOrder,
          ?????string?lang,
          ?????XmlDataType?dataType
          ??);

          第一個(gè)方法允許我們使用自定義的排序表達(dá)式;第二個(gè)方法有5個(gè)參數(shù):分別是要排序的對(duì)象、排序順序、條件順序、語言類別和數(shù)據(jù)類型,下面就是使用該方法進(jìn)行排序的例子:?

          ?
          ??exp.AddSort("text()",XmlSortOrder.Ascending,XmlCaseOrder.None,"",XmlDataType.Text);

          一旦我們對(duì)XPath表達(dá)式添加了排序的功能,我們就可以調(diào)用XPathNavigator對(duì)象的Select()方法,并把編譯過的XPath表達(dá)式作 為參數(shù),Select()方法返回一個(gè)XPathNodeIterator對(duì)象,我們可以使用它遍歷我們所選擇的節(jié)點(diǎn)。?

          下面就是用C#編寫的實(shí)現(xiàn)排序功能的所有代碼:?

          ?
          ?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();
          ?}



          凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
          、轉(zhuǎn)載請(qǐng)注明來處和原文作者。非常感謝。

          posted on 2006-04-21 16:07 草兒 閱讀(191) 評(píng)論(0)  編輯  收藏 所屬分類: C#+XML
          主站蜘蛛池模板: 英超| 彩票| 涿州市| 博罗县| 宁陵县| 仁布县| 阿巴嘎旗| 柳州市| 会泽县| 青海省| 喀喇| 刚察县| 伽师县| 昌宁县| 肇庆市| 德兴市| 望城县| 辉南县| 手机| 贵南县| 宾阳县| 枞阳县| 虞城县| 高淳县| 嵩明县| 泗水县| 灵寿县| 固镇县| 营山县| 文水县| 田林县| 芷江| 敦化市| 永定县| 垫江县| 阆中市| 黔东| 碌曲县| 崇信县| 五峰| 临洮县|