在.NET中操作XmlDocument

80酷酷网    80kuku.com

  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;    }}


分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: