C#解析XML檔案
內容提要
1.解析Xml檔案有哪些方法?各有什麼優缺點?
2.如何用XPath解析xml文件的要點。
先來看看解析xml檔案的方法都有哪些吧,本段文字來自網路,可以幫助大家對這個問題有個概要的瞭解。
在程式中訪問並操作XML檔案一般有兩種模型:流模型和DOM(文件物件模型)。流模型中有兩種變體——“推”模型和“拉”模型。
“推”模型也就是常說的SAX,SAX是一種靠事件驅動的模型。它每發現一個節點就用“推”模型引發一個事件,而我們必須編寫這些事件的處理程式,很麻煩。
.NET中使用的是基於“拉”模型的實現方案。 “拉”模型在遍歷文件時會把感興趣的文件部分從讀取器中拉出,不需要引發事件,允許我們以程式設計的方式訪問文件,這大大的提高了靈活性,“拉”模型可以選擇性的處理節點。在.NET中,“拉”模型透過XML閱讀器(XMLTextReader類)來實現的。該類提供Xml檔案讀取的功能,它可以驗證文件是否格式良好,如果不是格式良好的Xml文件,該類在讀取過程中將會丟擲XmlException異常。任何時候在記憶體中只有當前節點,但它是隻讀的,向前的,不能在文件中執行向後導航操作。
DOM的好處在於它允許編輯和更新XML文件,可以隨機訪問文件中的資料,可以使用XPath查詢。但是,DOM的缺點在於它需要一次性的載入整個文件到記憶體中,對於大型的文件,這會造成資源問題。在.NET中使用XML DOM分析器(XMLDocument)實現DOM模型。
因此,.NET Framework完全支援XML DOM模式,但它不支援SAX模式。.NET Framework支援兩種不同的分析模式:XML DOM分析器(XMLDocument類)和XML閱讀器(XMLTextReader類),不支援SAX分析器, 但這並不意味著它沒有提供類似SAX分析器的功能。透過XML閱讀器可以將SAX的所有的功能很容易的實現及更有效的運用。
在專案中,我們選用xpath的方式來解析xml文件。這是基於以下的幾點原因:
1, 檔案大小。要處理的檔案不大,一般都在幾百K到1M。
2, XPath的靈活性。不需要獲取文件的全部資料,只需要獲取大部分想要的資料。
3, 學習代價低。符合一般的思維習慣,透過Path獲取結果。
透過XPath的方式解析xml文件,需要先載入文件,然後再讀取想要的節點值。
xml文件
protected XmlDocument doc = null;
xml文件的根元素(節點)
protected XmlElement root = null;
xml文件的名空間管理器
protected XmlNamespaceManager nsmgr = null;
接下來就是載入文件了
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);
}
這裡有幾行要注意:
這兩行是取得xml文件的名空間
Code highlighting produced by Actipro CodeHighlighter (freeware)
--> root = doc.DocumentElement;
string nameSpace = root.NamespaceURI;
這兩行是建立xml文件的名空間管理器
Code highlighting produced by Actipro CodeHighlighter (freeware)
--> nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ns", nameSpace);
如果你的xml文件有名空間,則這部分的程式碼是必不可少的。
接下來就是讀取文件節點的值了:
這裡兩個傳入引數prefixPath是節點的上級節點路徑,xRelativePath是要讀取的節點名稱。
另外,變數XmlFileInfo是要載入的xml檔案。
Code highlighting produced by Actipro CodeHighlighter (freeware)
--> 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]的標識方式。
Code highlighting produced by Actipro CodeHighlighter (freeware)
-->xml version="1.0" encoding="UTF-8" ?>
<Root xmlns="urn:ClassNameSpace">
<Class>
<ClassID>1234ClassID>
Class>
<Students>
<Student>
<ID>01ID><Name>Name01Name>
Student>
<Student>
<ID>02ID><Name>Name02Name>
Student>
Students>
Root>
當然,這裡也可以獲取節點屬性的值,查詢滿足特定值的節點等等,這些和上面獲取節點值的過程是類似的。這裡推薦一篇介紹xpath的文章XPath 教程,大家不妨看看,關於xpath的常見問題都可以得到解決。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20200170/viewspace-739828/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- c#(解析xml檔案基礎方法)C#XML
- python XML 檔案解析PythonXML
- jdom解析xml檔案XML
- C#讀取Xml檔案C#XML
- 使用 Java 解析XML檔案JavaXML
- XML 檔案解析實踐 (DOM 解析)XML
- C# XML解析C#XML
- 使用C#讀寫xml檔案C#XML
- Python解析XML檔案生成HTMLPythonXMLHTML
- springMVC---配置檔案解析(web.xml)SpringMVCWebXML
- 基於 DOM 的 XML 檔案解析類XML
- 如何使用 ABAP 程式碼解析 XML 檔案XML
- mybatis原始碼配置檔案解析之五:解析mappers標籤(解析XML對映檔案)MyBatis原始碼APPXML
- C# XML基礎入門(XML檔案內容增刪改查清)C#XML
- xml檔案XML
- mybatis的全域性配置檔案SqlMapConfig.xml解析MyBatisSQLXML
- ie中jQuery無法解析xml檔案的解決方案jQueryXML
- AndroidMainfest.xml檔案AndroidAIXML
- xml是什麼格式的檔案 xml檔案怎麼開啟XML
- java 語音用xml檔案實現圖形介面 xml檔案JavaXML
- 解析XML檔案時,無效的XML 字元 (Unicode: 0x7)異常處理XML字元Unicode
- Android學習筆記之AndroidManifest.xml檔案解析(詳解)Android筆記XML
- 死磕Spring之IoC篇 - 解析自定義標籤(XML 檔案)SpringXML
- 死磕Spring之IoC篇 - BeanDefinition 的解析階段(XML 檔案)SpringBeanXML
- Go xml檔案處理GoXML
- nodejs xmlreader 讀寫xml檔案NodeJSXML
- ajax與XML檔案互動XML
- 使用xml檔案配置SSM整合XMLSSM
- 給XML檔案定義DTDXML
- 清單檔案 AndroidManifest.xmlAndroidXML
- Java系列:讀取XML檔案JavaXML
- Xml解析XML
- 【SSM框架整合】專案xml檔案、properties等檔案的配置SSM框架XML
- C#檔案列表C#
- C#配置檔案C#
- C# 檔案操作C#
- Mybatis 學習筆記(一)——配置檔案SqlMapConfig.xml和對映檔案Mapper.xmlMyBatis筆記SQLXMLAPP
- 怎麼解析 xml 檔案,把裡面某個元素,自動生成其 xpathXML
- Linux shell格式化XML檔案LinuxXML