在.NET中操作XmlDocument

类别:.NET开发 点击:0 评论:0 推荐:

大家想必一定都了解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;
    }
}

本文地址:http://com.8s8s.com/it/it45703.htm