大家在.Net中處理XML文檔的時候,經常會需要找到文檔中的某個節點的數據。要找到某個節點,有許多種方法,在這裡我就把幾種常用的方法給大家總結一下。
首先,我們要做的是要把一個XML文檔裝入到一個XMLDocument對象中去。
先引用幾個名字空間:
using System.XML;
using System.XML.Xsl;
using System.XML.XPath;
這幾個名字空間大家根據名字就知道它的意思了,我就不在這兒多說了。然後就是裝入XML文件的代碼,方法如下:
String xmlfile="c:/member.xml"; //其中的xmlfile是你要載入的XML文件的路徑。
XmlDocument myDoc = new XmlDocument(); //定義一個XMLDocument對象。
myDoc.Load(XMLfile);
這樣,我們就有一個叫myDoc的XML文檔。我們現在就來找這個文檔中的一些節點。我們先來看這個XML文件的內容。
<?XML version="1.0" encoding="UTF-8"?>
<members>
<member>
<name>Tim</name>
<hobby>reading</hobby>
<homepage>www.ASPcool.com</homepage>
</member>
<member>
<name>Sandy</name>
<hobby>learning</hobby>
</member>
<member>
<name>Shally</name>
<hobby>tranlating</hobby>
</member>
<member>
<name>Christine</name>
<hobby>working</hobby>
</member>
</members>
我們現在可以用下面的方法找到name為tim的節點:
myDoc.ChildNodes.Item(1).ChildNodes.Item(0).FirstChild.InnerText
這個方法要求我們一層層向內找我們需要的數據,如果層次很多的話,做起來就會很費勁,也容易出錯。幸好.Net給我們提供了另外一個方法SelectSingleNode和SelectNodes方法可以讓我們直接找到所要的數據。比如,我們要找姓名為“Tim”的用戶的hobby,我們可以用下面的方法:
myDoc.SelectSingleNode ("//member[name='Tim']").ChildNodes.Item(1).InnerText
其中//代表裡面任意層的子節點。這樣我們就可以很快的找到所要的東西。SelectSingleNode是找到一個單一的節點,SelectNodes可以找到許多節點。
在XML中尋找某個子節點,大家都知道怎麼做了,我們現在在一個特殊的XML文件---XSL文件中去找一個子節點,這個應該怎麼實現呢?
假設我現在有一個這樣的XSL文件:
<?XML version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" XMLns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:preserve-space elements="codes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="image">
<table align="{@location}">
<tr>
<td>
<img align="{@location}" alt="{text()}">
<xsl:attribute name="src">../FTP_Magazine/FTP_Issue/<xsl:value-of select="@url"/></xsl:attribute>
</img>
</td>
</tr>
<tr>
<td>
<center>
<xsl:apply-templates/>
</center>
</td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
我們在ASP.Net中有兩個變量,我們需要XSL文件在Transform XML文件的時候采用這兩個變量。我們該如何去做呢?
我所采取的方法是先把XSL文件作為XML Document裝載進來,在使用之前,我們找到需要修改的節點,用我們的變量對其進行修改。這個時候我們查找這個節點的時候需要做些變動,代碼如下:
XmlNamespaceManager nsmanager = new XMLNamespaceManager(xslDoc.NameTable);
nsmanager.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");
xslDoc.SelectSingleNode("//xsl:attribute[@name='src']", nsmanager).InnerXML = 你所需要輸給的變量
也就是說對於類似<xsl:attribute name="src">../FTP_Magazine/FTP_Issue/<xsl:value-of select="@url"/></xsl:attribute>這樣的節點,在我們查找以前,我們需要定義一個XMLNamespaceManager,用它我們就可以找到我們所需要的節點。