在.Net中使用XML
如果使用過MSXML3,那麼在.NET應用程序中使用XML將是一個相當簡單的過程。即時沒有接觸過MSXML3,也不要緊,你會發現使用.Net平台提供的相關類也是很容易的一件事情。
有兩種主要API可用於訪問建立在XML文檔中的數據,它們包括只向前的無緩沖存取以及隨機存取,而且自始至終都使用到文檔對象模型DOM。有關這2個API的類位於System.XML集合中。
如果要快速有效地訪問XML文檔中的數據,就需要使用XmlTextReader類。這個類采取“拉”模式處理方式,要比簡單XML API(SAX)中的“推”模式處理方式優越許多。使用XmlTextReader類之前首先要引用System.XML集合,在C#中是使用“using”關鍵字來引用,在Visual Basic中則是使用“imports”關鍵字。引用了集合後,就可以象下面的代碼所示開始例示讀操作了:
XmlTextReader reader = new XmlTextReader(pathToXMLDoc);
int elementCount = 0;
while (reader.Read()) {
if (reader.NodeType == XMLNodeType.Element) {
elementCount++;
}
}
XmlTextReader類中有幾個不同的構造器,上面所示的負責接收一個XML文件的路徑作為字符串參數。
雖然只向前的“拉”模式處理相當有效率,但它卻是只讀的,所以不能允許執行插入、刪除或者更新XML文檔節點的操作。當需要對XML文檔施加更多的控制並需要更大的靈活性時,我們可以看一看文檔對象模型DOM。DOM API的功能將XML文檔中的每一個節點裝載到一個樹形結構中,看起來就象是一個“家譜”。內存中有了這個結構,隨機存取XML文檔中的不同節點就變得可行。
開始創建DOM樹形結構前,首先引用System.Xml集合,然後例示XMLDocument類:
XmlDocument xmlDoc = new XMLDocument();
xmlDoc.Load(pathToXMLDoc);
XmlNode root = XMLDoc.DocumentElement;
通過使用XmlDocument類中的相關方法,在樹形結構中添加節點的操作可以很容易地完成。下面的例子演示了如何從一個文件中裝載XML,然後在根節點root下添加一個子元素以及它的相關屬性:
XmlDocument xmlDoc = new XMLDocument();
XmlDoc.Load(pathToXMLDoc);
XmlElement root = XMLDoc.DocumentElement;
XMLElement newNode = doc.CreateElement("newNode");
newNode.SetAttribute("id","1");
root.AppendChild(newNode);
以上代碼執行後,將產生下面的XML文檔:
<?XML version="1.0"?>
<root>
<newNode id="1"/>
</root>
當需要將包含XML的字符串裝載進DOM中時,可以使用XmlDocument類的LoadXml()方法。裝載進去後,就可以按照下面的方式操作XML:
string myXML = "<root><someNode>Hello</someNode></root>";
XmlDocument xmlDoc = new XMLDocument();
xmlDoc.LoadXml(myXML);
//....manipulation or reading of the nodes can occur here
除了以上幾種,在System.XML集合中還有多種其他類可用於執行不同的任務。上面的介紹僅僅是淺嘗則止,大量的應用還需要更多的練習。
讀取XML文件
下面介紹如何使用XmlTextReader類讀取XML文檔,並將數據顯示輸出。
System.XML名稱空間中定義了兩個類-XmlReader與XmlTextReader,其中XmlTextReader類來源於XmlReader類,而XmlTextReader類就可以用於讀取XML文檔,這個文檔的Read函數將讀取文檔內容,直到節點尾部。
以下是具體的實現步驟:
1、引用名稱空間
因為相關XML的類是在System.XML名稱空間中定義的,所以第一件事情就是引用這個名稱空間:
using System.XML;
2、打開XML文檔
XmlTextReader類的構造器可用於打開一個XML文件。本例程的XML文件叫做xmltest.xml,位於C:\temp目錄下。打開文件c:\temp\xmltest.XML的命令如下:
XmlTextReader reader = new XmlTextReader("C:\\temp\\xmltest.XML");
3、讀取數據
讀取XML文件的數據,可以使用XMLTextReader類的Read方法:
while ( reader.Read() )
{
Console.WriteLine(reader.Name);
}
4、完整執行代碼readXML.cs
namespace WriteToXML
{
using System;
using System.XML;
/// <summary>
/// Summary description for Class1.
/// </summary>
public class Class1
{
public Class1()
{
}
public static int Main(string[] args)
{
try
{
XmlTextWriter writer = new XmlTextWriter("C:\\temp\\xmltest.XML", null);
writer.WriteStartDocument();
writer.WriteComment("Commentss: XMLWriter Test Program");
writer.WriteProcessingInstrUCtion("Instruction","Person Record");
writer.WriteStartElement("p", "person", "urn:person");
writer.WriteStartElement("LastName","");
writer.WriteString("Chand");
writer.WriteEndElement();
writer.WriteStartElement("FirstName","");
writer.WriteString("Chand");
writer.WriteEndElement();
writer.WriteElementInt16("age","", 25);
writer.WriteEndDocument();
}
catch (Exception e)
{
Console.WriteLine ("Exception: {0}", e.ToString());
}
return 0;
}
}
}
插入數據到XML文檔中
要實現將XML數據插入到一個現存文檔或者一個新文檔中的目的,可以使用XmlNode類和XMLDocument類。具體的實現步驟如下:
1、引用名稱空間
因為相關XML的類是在System.XML名稱空間中定義的,所以第一件事情就是引用這個名稱空間:
using System.XML;
2、裝載XML到文檔中
我們可以使用XmlDocument的LoadXml方法將XML數據裝載到一個文檔中,或者是裝載一個現存的XML文檔。下面的代碼裝載XML數據到文檔中:
XmlDocument doc = new XMLDocument();
doc.LoadXml("<XMLFile>" +
" <SomeData>Old Data</SomeData>" +
"</XMLFile>");
3、插入XML數據
下面的代碼將XML數據插入到文件中,然後保存為InsertedDoc.XML:
try
{
XMLNode currNode;
XmlDocument doc = new XMLDocument();
doc.LoadXml("<XMLFile>" +
" <SomeData>Old Data</SomeData>" +
"</XMLFile>");
XMLDocumentFragment docFrag = doc.CreateDocumentFragment();
docFrag.InnerXML="<Inserted>" +
" <NewData>Inserted Data</NewData>" +
"</Inserted>";
// insert the availability node into the document
currNode = doc.DocumentElement.FirstChild;
currNode.InsertAfter(docFrag, currNode.LastChild);
//save the output to a file
doc.Save("InsertedDoc.XML");
}
catch (Exception e)
{
Console.WriteLine ("Exception: {0}", e.ToString());
}
代碼執行後,新文檔的內容如下:
- <XMLFile>
- <SomeData>
Old Data
- <Inserted>
<NewData>Inserted Data</NewData>
</Inserted>
</SomeData>
</XMLFile>