在.NET中操作XmlDocument

原创 2003年04月08日 14:23:00

大家想必一定都了解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>
 
我们也可是使用
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>
下面我介绍如何合并节点。假设我们有两个文件
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;
    }
}

C#操作Xml:通过XmlDocument读写Xml文档

转自:http://www.cnblogs.com/yukaizhao/archive/2011/07/19/csharp_xmldocument_access_xml.html X...
  • lyljp
  • lyljp
  • 2016年10月09日 16:15
  • 1809

vb 操作xml方法总结

Private Sub xxx(ByVal xmlStr As String) ''初始化xml文档 Dim xmlDoc As New XmlDocument ...
  • yuewei19
  • yuewei19
  • 2014年12月11日 15:21
  • 2779

object 与xml的转换读取

1.object ====> xml XmlDocument doc = new XmlDocument();  XmlElement Root = doc.CreateElement("Tabl...
  • aabbjj
  • aabbjj
  • 2015年03月05日 17:15
  • 755

创建跨浏览器Javascript的XMLDocument对象

在用javascript操作xml的过程中,遇到最大的问题就是跨浏览器兼容。我解决的思路是:是运用外观模式,得到不同浏览器所需XmlDocument对象。但在不同浏览器下的XmlDocument对象又...
  • suleil1
  • suleil1
  • 2015年10月28日 16:54
  • 155

使用tinyxml2生成和解析xml文档

xml文档主要用于储存数据进行配置。 tinyxml2的官方文档 https://github.com/leethomason/tinyxml2 第一步是建立一个c++文件 这里使用的是qt cre...
  • WAN_EXE
  • WAN_EXE
  • 2017年04月13日 11:55
  • 838

组件与.NET互操作

1、何谓组件技术? 组件技术就是利用某种编程手段,将一些人们所关心的,但又不便于让最终用户去直接操作的细节进行了封装,同时对各种业务逻辑规则进行了实现,用于处理用户的内部操作细节,甚至于将安全机制和事...
  • bigpudding24
  • bigpudding24
  • 2015年10月26日 13:10
  • 586

在.NET平台用DocX操作Word文件

最近项目需要输出聘书,聘书就是个Word做成的模板,需要把名字、岗位等文字替换一下。 如果用微软自带的Word编辑DLL,感觉很不好 于是找到了DocX,项目地址https://docx.code...
  • sfqpublic
  • sfqpublic
  • 2016年02月28日 20:14
  • 1676

.NET操作XML文件---[添加]

最近学习了.NET操作XML文件,总结如下: 关于XML 全名:可扩展标记语言 (Extensible Markup Language) XML用于标记电子文件使其具有结构性的标记语言,可以用来...
  • wyzhangchengjin123
  • wyzhangchengjin123
  • 2013年03月06日 12:02
  • 3087

C#操作Xml:通过XmlDocument读写Xml文档

http://www.cnblogs.com/yukaizhao/archive/2011/07/19/csharp_xmldocument_access_xml.html 什么是X...
  • u011854789
  • u011854789
  • 2017年11月21日 11:45
  • 56

C#操作XML的完整例子——XmlDocument篇

这是一个用c#控制台程序下,  用XmlDocument 进行XML操作的的例子,包含了查询、增加、修改、删除、保存的基本操作。较完整的描述了一个XML的整个操作流程。适合刚入门.net XML操作的...
  • amohan
  • amohan
  • 2013年11月16日 14:22
  • 1495
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在.NET中操作XmlDocument
举报原因:
原因补充:

(最多只允许输入30个字)