大家想必一定都了解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
1001
Ford
Escort
1984
1002
Toyota
Tercel
1996
1003
Mazda
GLC
1985
docDriver.xml
1
Albert
Einstein
2
Clint
Eastwood
3
James
Bond
下面的代码将增加一个节点:
Dim myDoc As XMLDocumentEx = New XMLDocumentEx()
myDoc.LoadXml("")
myDoc.AddNode(docVehicle.SelectSingleNode("//Record"), "VehicleRecord", "Data")
myDoc.AddNode(docDriver.SelectSingleNode("//Record"), "DriverRecord", "Data")
myDoc.xml
...
...
...
...
Vehicle Record>
...
...
...
我们也可是使用AddNodes方法把一个记录集的所有记录增加到节点上:Dim myDoc As XMLDocumentEx = New XMLDocumentEx()
myDoc.LoadXml(" ")
myDoc.AddNodes(docVehicle.SelectNodes("//Record"), "VehicleRecord", " Vehicle Data")
myDoc.AddNodes(docDriver.SelectNodes("//Record"), "DriverRecord", "DriverData")结果如下:myDoc.xml
1001
Ford
Escort
1984
1002
Toyota
Tercel
1996
1003
Mazda
GLC
1985
1
Albert
Einstein
2
Clint
Eastwood
3
James
Bond
下面我介绍如何合并节点。假设我们有两个XmlDocument文件docBook1和docBook2,这两个文档都包含节点. 在docBook1 中的这个 节点 包含 , , and . 在docBook2中的这个 节点 包含 , , and . 下面的代码演示如何合并这两个book节点:Dim myDoc As XMLDocumentEx = New XMLDocumentEx()
myDoc.LoadXml(" ")
myDoc.MergeNode(docBook1.SelectSingleNode("//Book"), "Book", "Data ")
myDoc.MergeNode(docBook2.SelectSingleNode("//Book"), "Book", "Data")合并后的效果如下:myDoc.xml
...
< Chapter1 >...
...
...
...
...
下面是所有的源代码: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 {
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;
}
}
下面是这个类中操作节点的常用方法。
// 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
docDriver.xml
下面的代码将增加一个节点:
Dim myDoc As XMLDocumentEx = New XMLDocumentEx()
myDoc.LoadXml("")
myDoc.AddNode(docVehicle.SelectSingleNode("//Record"), "VehicleRecord", "Data")
myDoc.AddNode(docDriver.SelectSingleNode("//Record"), "DriverRecord", "Data")
myDoc.xml
Vehicle Record>
myDoc.LoadXml("
myDoc.AddNodes(docVehicle.SelectNodes("//Record"), "VehicleRecord", " Vehicle Data")
myDoc.AddNodes(docDriver.SelectNodes("//Record"), "DriverRecord", "DriverData")结果如下:myDoc.xml
下面我介绍如何合并节点。假设我们有两个XmlDocument文件docBook1和docBook2,这两个文档都包含
myDoc.LoadXml("
myDoc.MergeNode(docBook1.SelectSingleNode("//Book"), "Book", "Data ")
myDoc.MergeNode(docBook2.SelectSingleNode("//Book"), "Book", "Data")合并后的效果如下:myDoc.xml
< Chapter1 >...
下面是所有的源代码: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
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;
}
}
