xml
大家想必一定都了解XML,利用XML技术来存储数据和文档是一件很容易的事情,.NET Framework 在它的命名空间System.Xml 就提供了一种可以很方便的操作xml的类XmlDocument,它使用起来非常容易,XmlDocument 其实就是一个简单的树。下面详细的介绍XmlDocument 的使用方法。
下面是这个类中操作节点的常用方法。
// create a new node in the document object from the source node
//and name it as "sName"
// the return value indicates success or failure
public bool AddNode(XmlNode oSource, String sName);
// same as above except that it also specifies the parent node of the
// newly created node
// the return value indicates success or failure (returns false if the
// parent node does not exist)
public bool AddNode(XmlNode oSource, String sName, String sParent);
// create a set of new nodes in the document object from the source node
// list and name them as "sName"
// the return value indicates success or failure
public bool AddNodes(XmlNodeList oSourceList, String sName);
// same as above except that it also specifies the parent node of the
// newly created nodes the return value indicates success or failure
// (returns false if the parent node
// does not exist)
public bool AddNodes(XmlNodeList oSourceList, String sName, String sParent);
// merge the source node into a node named "sName" in the document object
// the node named "sName" will be created if it does not exist
// the return value indicates success or failure
public bool MergeNode(XmlNode oSource, String sName);
// same as above except that it also specifies the parent node of the merged node
// the return value indicates success or failure (returns false if the parent node
// does not exist)
public bool MergeNode(XmlNode oSource, String sName, String sParent);
下面我们给一个增加节点的例子
docVechile.xml
<VehicleData> <Record> <id>1001</id> <make>Ford</make> <model>Escort</model> <year>1984</year> </Record> <Record> <id>1002</id> <make>Toyota</make> <model>Tercel</model> <year>1996</year> </Record> <Record> <id>1003</id> <make>Mazda</make> <model>GLC</model> <year>1985</year> </Record> </VehicleData>
docDriver.xml
<DriverData> <Record> <id>1</id> <firstname>Albert</firstname> <lastname>Einstein</lastname> </Record> <Record> <id>2</id> <firstname>Clint</firstname> <lastname>Eastwood</lastname> </Record> <Record> <id>3</id> <firstname>James</firstname> <lastname>Bond</lastname> </Record></DriverData>
下面的代码将增加一个节点:
Dim myDoc As XMLDocumentEx = New XMLDocumentEx()myDoc.LoadXml("<Data></Data>")myDoc.AddNode(docVehicle.SelectSingleNode("//Record"), "VehicleRecord", "Data")myDoc.AddNode(docDriver.SelectSingleNode("//Record"), "DriverRecord", "Data")
myDoc.xml
<Data> <VehicleRecord> <id>...</id> <make>...</make> <model>...</model> <year>...</year> </ Vehicle Record> <DriverRecord> <id>...</id> <firstname>...</firstname> <lastname>...</lastname> </DriverRecord></Data>
我们也可是使用AddNodes方法把一个记录集的所有记录增加到节点上:
Dim myDoc As XMLDocumentEx = New XMLDocumentEx()myDoc.LoadXml("<Data> <VehicleData></Vehicle Data><DriverData></DriverData> </Data>")myDoc.AddNodes(docVehicle.SelectNodes("//Record"), "VehicleRecord", " Vehicle Data")myDoc.AddNodes(docDriver.SelectNodes("//Record"), "DriverRecord", "DriverData")
结果如下:
myDoc.xml
<Data> <VehicleData> <VehicleRecord> <id>1001</id> <make>Ford</make> <model>Escort</model> <year>1984</year> </VehicleRecord> <VehicleRecord> <id>1002</id> <make>Toyota</make> <model>Tercel</model> <year>1996</year> </VehicleRecord> <VehicleRecord> <id>1003</id> <make>Mazda</make> <model>GLC</model> <year>1985</year> </VehicleRecord> </VehicleData> <DriverData> <DriverRecord> <id>1</id> <firstname>Albert</firstname> <lastname>Einstein</lastname> </DriverRecord> <DriverRecord> <id>2</id> <firstname>Clint</firstname> <lastname>Eastwood</lastname> </DriverRecord> <DriverRecord> <id>3</id> <firstname>James</firstname> <lastname>Bond</lastname> </DriverRecord> </DriverData></Data>
下面我介绍如何合并节点。假设我们有两个XmlDocument文件docBook1和docBook2,
这两个文档都包含 <Book>
节点. 在docBook1
中的这个 <Book>
节点 包含
<Introduction>
, <Chapter1>
, and <Chapter2>
.
在docBook2
中的这个 <Book>
节点 包含 <Chapter3>
, <Chapter4>
, and <Chapter5>
.
下面的代码演示如何合并这两个book节点:
Dim myDoc As XMLDocumentEx = New XMLDocumentEx()myDoc.LoadXml("<Data> <Book></Book></Data> ")myDoc.MergeNode(docBook1.SelectSingleNode("//Book"), "Book", "Data ")myDoc.MergeNode(docBook2.SelectSingleNode("//Book"), "Book", "Data")
合并后的效果如下:
myDoc.xml
<Data> <Book> <Introduction>...</Introduction> < Chapter1 >...</Chapter1> <Chapter2>...</Chapter2> <Chapter3>...</Chapter3> <Chapter4>...</Chapter4> <Chapter5>...</Chapter5> </Book></Data>
下面是所有的源代码:
sealed public class XMLDocumentEx: XmlDocument{ public bool AddNode(XmlNode oSource, String sName) { return AddNode(oSource, sName, null); } public bool AddNode(XmlNode oSource, String sName, String sParent) { try { if(sName!=null&&oSource!= null) { // create the new node with given name XmlNode oNewNode = CreateElement(sName); // copy the contents from the source node oNewNode.InnerXml = oSource.InnerXml; // if there is no parent node specified, then add // the new node as a child node of the root node if(sParent!= null) sParent = sParent.Trim(); if(sParent== null||sParent.Equals(String.Empty)) { DocumentElement.AppendChild(oNewNode); return true; } // otherwise add the new node as a child of the parent node else { if (!sParent.Substring(0,2).Equals("//")) sParent = "//"+sParent; XmlNode oParent = SelectSingleNode(sParent); if (oParent!=null) { oParent.AppendChild(oNewNode); return true ; } } } } catch (Exception) { // error handling code } return false; } public bool AddNodes(XmlNodeList oSourceList, String sName) { return AddNodes(oSourceList, sName, null); } public bool AddNodes(XmlNodeList oSourceList, String sName, String sParent) { try { if(oSourceList!= null) { // call AddNode for each item in the source node list // return true only if all nodes are added successfully int i = 0; while(i<oSourceList.Count) { if (!AddNode(oSourceList.Item(i),sName,sParent)) return false; i++; } return true; } } catch (Exception) { // error handling code } return false; } public bool MergeNode(XmlNode oSource, String sName) { return MergeNode(oSource, sName, null ); } public bool MergeNode(XmlNode oSource, String sName, String sParent) { try { if(sName!=null&&oSource!= null) { XmlNode theNode = null ; // if there is no parent node specified ... if(sParent!= null) sParent = sParent.Trim(); if(sParent== null||sParent.Equals(String.Empty)) { // if the node with specified name does not exist, // add it as a child node of the root node theNode = SelectSingleNode("//"+sName); if (theNode==null) { theNode = CreateElement(sName); DocumentElement.AppendChild(theNode); } } // if the parent node is specified ... else { // find the parent node if (!sParent.Substring(0,2).Equals("//")) sParent = "//"+sParent; XmlNode theParent = SelectSingleNode(sParent); if (theParent!=null) { // if the node with specified name does not exist, create // it first, then add it as a child node of the parent node theNode = theParent.SelectSingleNode(sName); if(theNode==null) { theNode = CreateElement(sName); theParent.AppendChild(theNode); } } } // merge the content of the source node into // the node with specified name if(theNode!= null) { theNode.InnerXml += oSource.InnerXml; return true; } } } catch (Exception) { } return false; }}