大家想必一定都了解XML,利用XML技术来存储数据和文档是一件很容易的事情,.NET Framework 在它的命名空间System.Xml 就提供了一种可以很方便的操作xml的类XmlDocument,它使用起来非常容易,XmlDocument 其实就是一个简单的树。下面详细的介绍XmlDocument 的使用方法。
下面是这个类中操作节点的常用方法。
public bool AddNode(XmlNode oSource, String sName);
public bool AddNode(XmlNode oSource, String sName, String sParent);
public bool AddNodes(XmlNodeList oSourceList, String sName);
public bool AddNodes(XmlNodeList oSourceList, String sName, String sParent);
public bool MergeNode(XmlNode oSource, String sName);
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)
{
XmlNode oNewNode = CreateElement(sName);
oNewNode.InnerXml = oSource.InnerXml;
if(sParent!= null) sParent = sParent.Trim();
if(sParent== null||sParent.Equals(String.Empty))
{
DocumentElement.AppendChild(oNewNode);
return true;
}
else
{
if (!sParent.Substring(0,2).Equals("//")) sParent = "//"+sParent;
XmlNode oParent = SelectSingleNode(sParent);
if (oParent!=null)
{
oParent.AppendChild(oNewNode);
return true ;
}
}
}
}
catch (Exception)
{
}
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)
{
int i = 0;
while(i<oSourceList.Count)
{
if (!AddNode(oSourceList.Item(i),sName,sParent)) return false;
i++;
}
return true;
}
}
catch (Exception)
{
}
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(sParent!= null) sParent = sParent.Trim();
if(sParent== null||sParent.Equals(String.Empty))
{
theNode = SelectSingleNode("//"+sName);
if (theNode==null)
{
theNode = CreateElement(sName);
DocumentElement.AppendChild(theNode);
}
}
else
{
if (!sParent.Substring(0,2).Equals("//")) sParent = "//"+sParent;
XmlNode theParent = SelectSingleNode(sParent);
if (theParent!=null)
{
theNode = theParent.SelectSingleNode(sName);
if(theNode==null)
{
theNode = CreateElement(sName);
theParent.AppendChild(theNode);
}
}
}
if(theNode!= null)
{
theNode.InnerXml += oSource.InnerXml;
return true;
}
}
}
catch (Exception)
{
}
return false;
}
}

|