http://www.csharpwin.com/csharpspace/3968r4687.shtml
C# XML解析通過XPath的方式的步驟:
1、需要先載入文檔,然後再讀取想要的節點值。
◆xml文檔
protected XmlDocument doc = null;
◆xml文檔的根項目(節點)
protected XmlElement root = null;
◆xml文檔的名空間管理器
protected XmlNamespaceManager nsmgr = null;
2、接下來就是載入文檔了
- protected void LoadXmlFile(FileInfo xmlFile)
- {
- if (xmlFile == null || !xmlFile.Exists)
- {
- throw new FileNotFoundException(
- string.Format("要解析的檔案不存在{0}。",
- xmlFile.FullName));
- }
- //負載檔案
- this.doc = new XmlDocument();
- doc.Load(xmlFile.FullName);
- //準備讀取檔案
- root = doc.DocumentElement;
- string nameSpace = root.NamespaceURI;
- nsmgr = new XmlNamespaceManager(doc.NameTable);
- nsmgr.AddNamespace("ns", nameSpace);
- }
◆C# XML解析通過XPath的方式要注意。
a、這兩行是取得xml文檔的名空間
- root = doc.DocumentElement;
- string nameSpace = root.NamespaceURI;
b、這兩行是建立xml文檔的名空間管理器
- nsmgr = new XmlNamespaceManager(doc.NameTable);
- nsmgr.AddNamespace("ns", nameSpace);
如果你的xml文檔有名空間,則這部分的代碼是必不可少的。
3、接下來就是讀取文檔節點的值了
這裡兩個傳入參數prefixPath是節點的上級節點路徑,xRelativePath是要讀取的節點名稱。
另外,變數XmlFileInfo是要載入的xml檔案。
- protected string GetNodeValue(
- string prefixPath, string xRelativePath)
- {
- if (doc == null)
- {
- LoadXmlFile(XmlFileInfo);
- }
- string xPath = string.Empty;
- if (!string.IsNullOrEmpty(xRelativePath))
- {
- if (!string.IsNullOrEmpty(prefixPath))
- {
- xPath = prefixPath + xRelativePath;
- }
- else
- {
- xPath = xRelativePath;
- }
- }
- xPath = xPath.Replace("/", "/ns:");
- XmlNode node = root.SelectSingleNode(xPath, nsmgr);
- if (node == null)
- {
- return null;
- }
- return node.InnerXml;
- }
可能有的朋友要問,為什麼要設定兩個參數prefixPath和xRelativePath呢,其實這個沒有多大的關係,我只是為了自己覺得方便,你也可以在方法外確定了這個XPath,在方法中只設定一個傳入參數,效果是一樣的。
◆注意這一行:
- xPath = xPath.Replace("/", "/ns:");
如果你的xml文檔帶名空間,則這行是比不可少的,否則會出現找不到節點,無法解析的情況。
關於XPath的一些問題:
對於這樣一個xml文檔,要尋找第一個節點下的學生的Name時(ID=01),其XPath應該是"/ns:Root/ns:Students/ns:Student[1]/ns:Name"。xml對於重複的節點名稱,是按照順序1,2,3...的方式遍曆的,也就是說如果要找第N個Student節點的下的節點之,那麼應使用Student[N]的標識方式。
- ﹤?xml version="1.0" encoding="UTF-8" ?﹥
- ﹤Root xmlns="urn:ClassNameSpace"﹥
- ﹤Class﹥
- ﹤ClassID﹥1234﹤/ClassID﹥
- ﹤/Class﹥
- ﹤Students﹥
- ﹤Student﹥
- ﹤ID﹥01﹤/ID﹥﹤Name﹥Name01﹤/Name﹥
- ﹤/Student﹥
- ﹤Student﹥
- ﹤ID﹥02﹤/ID﹥﹤Name﹥Name02﹤/Name﹥
- ﹤/Student﹥
- ﹤/Students﹥
- ﹤/Root﹥
當然,這裡也可以擷取節點屬性的值,尋找滿足特定值的節點等等,這些和上面擷取節點值的過程是類似的。
C# XML解析通過XPath的方式的實現就向你介紹到這裡,希望對你瞭解和學習C# XML解析有所協助。