加入收藏 - 网站地图 - 网站搜索 -
阅读新闻

在.NET中操作XmlDocument

[日期:01-17] [字体: ]
大家想必一定都了解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
  
     ...
    ...
    ...
    ...
  
  
    ...
    ...
    ...
  

我们也可是使用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;
  }
}


 
评论 】 【 推荐 】 【 打印
上一篇:用C#实现生成PDF文档(原码)
下一篇:C#的四个基本技巧
相关新闻