C#操作xml完整类文件

C#操作xml完整类文件

xml_oper.cs
using ...System;
using System.Data;
using System.Web;
using System.Xml;
/**//// <summary>
/// 类名:xml操作类
/// 作者:虫
/// 时间:2008.8.31
/// </summary>
public class xml_oper
...{
    private XmlDocument xmlDoc;  
public xml_oper()
...{
}
    /**//// <summary>
    /// 加载xml文件
    /// </summary>
    /// <param name="path">xml文件的物理路径</param>
    private void LoadXml(string path, string node_root)
    ...{
        xmlDoc = new XmlDocument();
        //判断xml文件是否存在
        if (!System.IO.File.Exists(path))
        ...{
            //创建xml 声明节点
            XmlNode xmlnode = xmlDoc.CreateNode(System.Xml.XmlNodeType.XmlDeclaration, "", "");
            //添加上述创建和 xml声明节点
            xmlDoc.AppendChild(xmlnode);
            //创建xml dbGuest 元素(根节点)
            XmlElement xmlelem = xmlDoc.CreateElement("", node_root, "");
            xmlDoc.AppendChild(xmlelem);
            try
            ...{
                xmlDoc.Save(path);
            }
            catch (Exception ex)
            ...{
                throw ex;
            }
            xmlDoc.Load(path);
        }
        else
        ...{
            //加载xml文件
            xmlDoc.Load(path);
        }
    }
    /**//// <summary>
    /// 添加xml子节点
    /// </summary>
    /// <param name="path">xml文件的物理路径</param>
    /// <param name="node_root">根节点名称</param>
    /// <param name="node_name">添加的子节点名称</param>
    /// <param name="node_text">子节点文本</param>
    public void addElement(string path, string node_root, string node_name, string node_text,string att_name,string att_value)
    ...{
        LoadXml(path, node_root);
        XmlNodeList nodeList = xmlDoc.SelectSingleNode(node_root).ChildNodes;//获取bookstore节点的所有子节点
        //判断是否有节点,有节点就遍历所有子节点,看看有没有重复节点,没节点就添加一个新节点
        if (nodeList.Count > 0)
        ...{
            foreach (XmlNode xn in nodeList)//遍历所有子节点  
            ...{
                XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型  
                if (xe.GetAttribute(att_name) != att_value)
                ...{
                    XmlNode xmldocSelect = xmlDoc.SelectSingleNode(node_root);  //选中根节点
                    XmlElement son_node = xmlDoc.CreateElement(node_name);    //添加子节点  
                    son_node.SetAttribute(att_name, att_value);    //设置属性
                    son_node.InnerText = node_text;    //添加节点文本
                    xmldocSelect.AppendChild(son_node);      //添加子节点
                    xmlDoc.Save(path);          //保存xml文件
                    break;
                }
            }
        }
        else  
        ...{
            XmlNode xmldocSelect = xmlDoc.SelectSingleNode(node_root);  //选中根节点
            XmlElement son_node = xmlDoc.CreateElement(node_name);    //添加子节点  
            son_node.SetAttribute(att_name, att_value);    //设置属性
            son_node.InnerText = node_text;    //添加节点文本
            xmldocSelect.AppendChild(son_node);      //添加子节点
            xmlDoc.Save(path);          //保存xml文件
        }
    }
    /**//// <summary>
    /// 修改节点的内容
    /// </summary>
    /// <param name="path">xml文件的物理路径</param>
    /// <param name="node_root">根节点名称</param>
    /// <param name="new_text">节点的新内容</param>
    /// <param name="att_name">节点的属性名</param>
    /// <param name="att_value">节点的属性值</param>
    public void UpdateElement(string path, string node_root, string new_text, string att_name, string att_value)
    ...{
        LoadXml(path, node_root);
        XmlNodeList nodeList = xmlDoc.SelectSingleNode(node_root).ChildNodes;//获取bookstore节点的所有子节点  
        foreach (XmlNode xn in nodeList)//遍历所有子节点  
        ...{
            XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型  
            if (xe.GetAttribute(att_name) == att_value)
            ...{
                xe.InnerText = new_text;    //内容赋值
                xmlDoc.Save(path);//保存  
                break;
            }
        }
         
    }
    /**//// <summary>
    /// 删除节点
    /// </summary>
    /// <param name="path">xml文件的物理路径</param>
    /// <param name="node_root">根节点名称</param>
    /// <param name="att_name">节点的属性名</param>
    /// <param name="att_value">节点的属性值</param>
    public void deleteNode(string path, string node_root, string att_name, string att_value)
    ...{
        LoadXml(path, node_root);
        XmlNodeList nodeList = xmlDoc.SelectSingleNode(node_root).ChildNodes;
        XmlNode root = xmlDoc.SelectSingleNode(node_root);
        foreach (XmlNode xn in nodeList)
        ...{
            XmlElement xe = (XmlElement)xn;
            if (xe.GetAttribute(att_name) == att_value)
            ...{
                //xe.RemoveAttribute("name");//删除name属性  
                xe.RemoveAll();//删除该节点的全部内容  
                root.RemoveChild(xe);
                xmlDoc.Save(path);//保存  
                break;
            }
        }
    }
}
  
View Code

C#解析XML基础

(转) C#解析XML基础
  

用的是一种很笨的方法,但可以帮助初学者了解访问XML节点的过程。 
已知有一个XML文件(bookstore.xml)如下:

1 <?xml version="1.0" encoding="gb2312"?> 
2  <bookstore> 
3   <book genre="fantasy" ISBN="2-3631-4"> 
4     <title>Oberon's Legacy</title> 
5     <author>Corets, Eva</author> 
6     <price>5.95</price> 
7   </book> 
8  </bookstore>

 
 1、往<bookstore>节点中插入一个<book>节点:

 1  XmlDocument xmlDoc=new XmlDocument();
 2    xmlDoc.Load("bookstore.xml");
 3    XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
 4     XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点
 5     xe1.SetAttribute("genre","李赞红");//设置该节点genre属性
 6     xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性
 7     XmlElement xesub1=xmlDoc.CreateElement("title");
 8    xesub1.InnerText="CS从入门到精通";//设置文本节点
 9     xe1.AppendChild(xesub1);//添加到<book>节点中
10     XmlElement xesub2=xmlDoc.CreateElement("author");
11    xesub2.InnerText="候捷";
12    xe1.AppendChild(xesub2);
13    XmlElement xesub3=xmlDoc.CreateElement("price");
14    xesub3.InnerText="58.3";
15    xe1.AppendChild(xesub3);
16    root.AppendChild(xe1);//添加到<bookstore>节点中
17     xmlDoc.Save("bookstore.xml");

 //================ 
 
结果为:

 1 <?xml version="1.0" encoding="gb2312"?> 
 2  <bookstore> 
 3   <book genre="fantasy" ISBN="2-3631-4"> 
 4     <title>Oberon's Legacy</title> 
 5     <author>Corets, Eva</author> 
 6     <price>5.95</price> 
 7   </book> 
 8   <book genre="李赞红" ISBN="2-3631-4"> 
 9     <title>CS从入门到精通</title> 
10     <author>候捷</author> 
11     <price>58.3</price> 
12   </book> 
13  </bookstore>

 
2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。

 1 //获取bookstore节点的所有子节点
 2  XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
 3    foreach(XmlNode xn in nodeList)//遍历所有子节点
 4     {
 5     XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
 6      if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红”
 7      {
 8      xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红”
 9       XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
10       foreach(XmlNode xn1 in nls)//遍历
11       {
12       XmlElement xe2=(XmlElement)xn1;//转换类型
13        if(xe2.Name=="author")//如果找到
14        {
15        xe2.InnerText="亚胜";//则修改
16         break;//找到退出来就可以了
17        }
18      }
19      break;
20     }
21    }
22    xmlDoc.Save("bookstore.xml");//保存。

  //=================
最后结果为:

 1 <?xml version="1.0" encoding="gb2312"?> 
 2  <bookstore> 
 3   <book genre="fantasy" ISBN="2-3631-4"> 
 4     <title>Oberon's Legacy</title> 
 5     <author>Corets, Eva</author> 
 6     <price>5.95</price> 
 7   </book> 
 8   <book genre="update李赞红" ISBN="2-3631-4"> 
 9     <title>CS从入门到精通</title> 
10     <author>亚胜</author> 
11     <price>58.3</price> 
12   </book> 
13  </bookstore>

 
  3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。

 1 XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
 2    foreach(XmlNode xn in xnl)
 3    {
 4     XmlElement xe=(XmlElement)xn;
 5  if(xe.GetAttribute("genre")=="fantasy")
 6     {
 7      xe.RemoveAttribute("genre");//删除genre属性
 8      }
 9     else if(xe.GetAttribute("genre")=="update李赞红")
10     {
11      xe.RemoveAll();//删除该节点的全部内容
12      }
13    }
14    xmlDoc.Save("bookstore.xml");

     //====================
最后结果为:

 1 <?xml version="1.0" encoding="gb2312"?> 
 2  <bookstore> 
 3   <book ISBN="2-3631-4"> 
 4     <title>Oberon's Legacy</title> 
 5     <author>Corets, Eva</author> 
 6     <price>5.95</price> 
 7   </book> 
 8   <book> 
 9   </book> 
10  </bookstore>

 
  4、显示所有数据。

 1 XmlNode xn=xmlDoc.SelectSingleNode("bookstore");
 2    XmlNodeList xnl=xn.ChildNodes;
 3    foreach(XmlNode xnf in xnl)
 4    {
 5     XmlElement xe=(XmlElement)xnf;
 6     Console.WriteLine(xe.GetAttribute("genre"));//显示属性值
 7      Console.WriteLine(xe.GetAttribute("ISBN"));
 8     XmlNodeList xnf1=xe.ChildNodes;
 9     foreach(XmlNode xn2 in xnf1)
10     {
11      Console.WriteLine(xn2.InnerText);//显示子节点点文本
12      }
13    }

 
转载:http://blog.csdn.net/s98/archive/2004/10/17/140307.aspx
 
View Code

C#操作XML的类:xmlHelper例子

首先,看下这个XmlHelper类库的结构,如下图:

然后,在Vs中新建一个解决方案,叫做XMLHelper,添加一个C# 类库项目XMLHelper,重命名Class1.cs为XmlHelper.cs。
再为XmlHelper.cs添加
using System.Collections;
using System.Xml;
这两个引用保证了我们可以使用XML的大部分功能和哈希表.
主要的代码如下:

 
C#代码  

1 namespace XMLHelper  
2 {  
3     public class XmlHelper  
4     {  
5         #region 公共变量  
6         XmlDocument xmldoc;  
7         XmlNode xmlnode;  
8         XmlElement xmlelem;  
9         #endregion  
10  
11         #region 创建Xml文档  
12         /// <summary>  
13         /// 创建一个带有根节点的Xml文件  
14         /// </summary>  
15         /// <param name="FileName">Xml文件名称</param>  
16         /// <param name="rootName">根节点名称</param>  
17         /// <param name="Encode">编码方式:gb2312,UTF-8等常见的</param>  
18         /// <param name="DirPath">保存的目录路径</param>  
19         /// <returns></returns>  
20         public bool CreateXmlDocument(string FileName, string rootName, string Encode)  
21         {  
22             try  
23             {  
24                 xmldoc = new XmlDocument();  
25                 XmlDeclaration xmldecl;  
26                 xmldecl = xmldoc.CreateXmlDeclaration("1.0", Encode, null);  
27                 xmldoc.AppendChild(xmldecl);  
28                 xmlelem = xmldoc.CreateElement("", rootName, "");  
29                 xmldoc.AppendChild(xmlelem);  
30                 xmldoc.Save(FileName);  
31                 return true;  
32             }  
33             catch (Exception e)  
34             {  
35                 return false;  
36                 throw new Exception(e.Message);  
37             }  
38         }  
39  
40         #endregion  
41  
42         #region 常用操作方法(增删改)  
43         /// <summary>  
44         /// 插入一个节点和它的若干子节点  
45         /// </summary>  
46         /// <param name="XmlFile">Xml文件路径</param>  
47         /// <param name="NewNodeName">插入的节点名称</param>  
48         /// <param name="HasAttributes">此节点是否具有属性,True为有,False为无</param>  
49         /// <param name="fatherNode">此插入节点的父节点</param>  
50         /// <param name="htAtt">此节点的属性,Key为属性名,Value为属性值</param>  
51         /// <param name="htSubNode">子节点的属性,Key为Name,Value为InnerText</param>  
52         /// <returns>返回真为更新成功,否则失败</returns>  
53         public bool InsertNode(string XmlFile, string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode)  
54         {  
55             try  
56             {  
57                 xmldoc = new XmlDocument();  
58                 xmldoc.Load(XmlFile);  
59                 XmlNode root = xmldoc.SelectSingleNode(fatherNode);  
60                 xmlelem = xmldoc.CreateElement(NewNodeName);  
61   
62                 if (htAtt != null && HasAttributes)//若此节点有属性,则先添加属性  
63                 {  
64                     SetAttributes(xmlelem, htAtt);  
65   
66                     SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);//添加完此节点属性后,再添加它的子节点和它们的InnerText  
67   
68                 }  
69                 else  
70                 {  
71                     SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);//若此节点无属性,那么直接添加它的子节点  
72                 }  
73   
74                 root.AppendChild(xmlelem);  
75                 xmldoc.Save(XmlFile);  
76   
77                 return true;  
78             }  
79             catch (Exception e)  
80             {  
81   
82                 throw new Exception(e.Message);  
83   
84             }  
85         }  
86         /// <summary>  
87         /// 更新节点  
88         /// </summary>  
89         /// <param name="XmlFile">Xml文件路径</param>  
90         /// <param name="fatherNode">需要更新节点的上级节点</param>  
91         /// <param name="htAtt">需要更新的属性表,Key代表需要更新的属性,Value代表更新后的值</param>  
92         /// <param name="htSubNode">需要更新的子节点的属性表,Key代表需要更新的子节点名字Name,Value代表更新后的值InnerText</param>  
93         /// <returns>返回真为更新成功,否则失败</returns>  
94         public bool UpdateNode(string XmlFile, string fatherNode, Hashtable htAtt, Hashtable htSubNode)  
95         {  
96             try  
97             {  
98                 xmldoc = new XmlDocument();  
99                 xmldoc.Load(XmlFile);  
100                 XmlNodeList root = xmldoc.SelectSingleNode(fatherNode).ChildNodes;  
101                 UpdateNodes(root, htAtt, htSubNode);  
102                 xmldoc.Save(XmlFile);  
103                 return true;  
104             }  
105             catch (Exception e)  
106             {  
107                 throw new Exception(e.Message);  
108             }  
109         }  
110   
111         /// <summary>  
112         /// 删除指定节点下的子节点  
113         /// </summary>  
114         /// <param name="XmlFile">Xml文件路径</param>  
115         /// <param name="fatherNode">制定节点</param>  
116         /// <returns>返回真为更新成功,否则失败</returns>  
117         public bool DeleteNodes(string XmlFile, string fatherNode)  
118         {  
119             try  
120             {  
121                 xmldoc = new XmlDocument();  
122                 xmldoc.Load(XmlFile);  
123                 xmlnode = xmldoc.SelectSingleNode(fatherNode);  
124                 xmlnode.RemoveAll();  
125                 xmldoc.Save(XmlFile);  
126                 return true;  
127             }  
128             catch (XmlException xe)  
129             {  
130                 throw new XmlException(xe.Message);  
131             }  
132         }  
133         #endregion  
134  
135         #region 私有方法  
136         /// <summary>  
137         /// 设置节点属性  
138         /// </summary>  
139         /// <param name="xe">节点所处的Element</param>  
140         /// <param name="htAttribute">节点属性,Key代表属性名称,Value代表属性值</param>  
141         private void SetAttributes(XmlElement xe, Hashtable htAttribute)  
142         {  
143             foreach (DictionaryEntry de in htAttribute)  
144             {  
145                 xe.SetAttribute(de.Key.ToString(), de.Value.ToString());  
146             }  
147         }  
148         /// <summary>  
149         /// 增加子节点到根节点下  
150         /// </summary>  
151         /// <param name="rootNode">上级节点名称</param>  
152         /// <param name="XmlDoc">Xml文档</param>  
153         /// <param name="rootXe">父根节点所属的Element</param>  
154         /// <param name="SubNodes">子节点属性,Key为Name值,Value为InnerText值</param>  
155         private void SetNodes(string rootNode, XmlDocument XmlDoc, XmlElement rootXe, Hashtable SubNodes)  
156         {  
157             foreach (DictionaryEntry de in SubNodes)  
158             {  
159                 xmlnode = XmlDoc.SelectSingleNode(rootNode);  
160                 XmlElement subNode = XmlDoc.CreateElement(de.Key.ToString());  
161                 subNode.InnerText = de.Value.ToString();  
162                 rootXe.AppendChild(subNode);  
163             }  
164         }  
165         /// <summary>  
166         /// 更新节点属性和子节点InnerText值  
167         /// </summary>  
168         /// <param name="root">根节点名字</param>  
169         /// <param name="htAtt">需要更改的属性名称和值</param>  
170         /// <param name="htSubNode">需要更改InnerText的子节点名字和值</param>  
171         private void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode)  
172         {  
173             foreach (XmlNode xn in root)  
174             {  
175                 xmlelem = (XmlElement)xn;  
176                 if (xmlelem.HasAttributes)//如果节点如属性,则先更改它的属性  
177                 {  
178                     foreach (DictionaryEntry de in htAtt)//遍历属性哈希表  
179                     {  
180                         if (xmlelem.HasAttribute(de.Key.ToString()))//如果节点有需要更改的属性  
181                         {  
182                             xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString());//则把哈希表中相应的值Value赋给此属性Key  
183                         }  
184                     }  
185                 }  
186                 if (xmlelem.HasChildNodes)//如果有子节点,则修改其子节点的InnerText  
187                 {  
188                     XmlNodeList xnl = xmlelem.ChildNodes;  
189                     foreach (XmlNode xn1 in xnl)  
190                     {  
191                         XmlElement xe = (XmlElement)xn1;  
192                         foreach (DictionaryEntry de in htSubNode)  
193                         {  
194                             if (xe.Name == de.Key.ToString())//htSubNode中的key存储了需要更改的节点名称,  
195                             {  
196                                 xe.InnerText = de.Value.ToString();//htSubNode中的Value存储了Key节点更新后的数据  
197                             }  
198                         }  
199                     }  
200                 }  
201   
202             }  
203         }  
204         #endregion  
205     }  
206 }  
207   
208   
209 文章来自学IT网:http://www.xueit.com/html/2009-08/21_4275_00.html  
下面讲解此类:
1、插入节点函数中的两个哈希表说明:
a.htAtt:用于存储了节点属性的哈希表,表中的Key对应了节点的属性名称,如<Fan Nickname="Jacky">这里的Nickname就是哈希表中的Key值,而Jacky就对应哈希表中的Value值,这样,你可以在插入节点前,把该节点的属性(多个)名称和对应的值先存入哈希表中,然后再传给函数即可增加多个属性。
b.htSubNode:存储了子节点的数据,子节点包括他的名字和InnerText值,如<Age>23</Age>这里的Age就是子节点名字,23就是节点的InnerText值。
2、修改节点函数中的哈希表说明:
a.htAtt:存储了待更新的属性值,传入函数后,函数将逐一对比,查看节点中是否含有htAtt的Key值,如果含有,则表明节点的该属性的值(Value)将被htAtt中相应的Value替换。
b.htSubNode:存储了子节点的修改信息,传入函数后,函数将逐一对比,查看子节点的节点名字是否含有htSubNode的Key值,如果含有,则表明此子节点需要被更新,则此节点的InnerText将被修改为相应的htSubNode的Value值。
好了,下面我们来看看类库运行起来的效果吧:
一、先创建Xml文件,如下:
 
我们来这个路径下,打开刚才创建的xml文档,内容如下:
Xml代码  

210 <a href="http://www.xueit.com/cshare/show-4275-2.aspx"><?xml version="1.0" encoding="utf-8"?>  
211 <AppSettings/></a>  
 
 
二、执行插入节点操作,如下图:(插入的节点数据在程序中,请稍候在本文尾部下载)
我们再打开这个文件,看看插入效果和程序中的一样么:
Xml代码  

212 <?xml version="1.0" encoding="utf-8"?>  
213 <AppSettings>  
214   <Fan Nickname="Jacky">  
215     <Age>23</Age>  
216   </Fan>  
217 </AppSettings>  
 
三、我们修改一下节点内容:

 
修改效果如下:
Xml代码  

218 <?xml version="1.0" encoding="utf-8"?>  
219 <AppSettings>  
220   <Fan Nickname="Doggy">  
221     <Age>3</Age>  
222   </Fan>  
223 </AppSettings>  
 
四、好了,删除刚才的那些节点吧:


又变回原样了:
 
Xml代码  

224 <?xml version="1.0" encoding="utf-8"?>  
225 <AppSettings/>  
 
OK,这就是这个Helper的主要功能,你可以重载一些函数,增加它的功能,让它更加健壮,这回我就多了个帮手了,呵呵,可以根据自己需求更改,以后就不怕写Xml了,当然,你也可以把它移植到移动项目中,同样可行,只是到时候请注意路径问题,最好使用绝对路径!

文章来自学IT网:http://www.xueit.com/cshare/show-4275-2.aspx
 
 
View Code

Linq To Xml学习 - 3.查询、更新、删除

文章最后有该示例的XML文档。
查找具有特定属性的元素
XElement root = XElement.Load("PurchaseOrder.xml");
IEnumerable address =
    from el in root.Elements("Address")
    where (string)el.Attribute("Type") == "Billing"
    select el;
foreach (XElement el in address)
    Console.WriteLine(el);
输出为:
<Address Type="Billing">
  <Name>Tai YeeName>
  <Street>8 Oak AvenueStreet>
  <City>Old TownCity>
  <State>PAState>
  <Zip>95819Zip>
  <Country>USACountry>
Address>
内存中 XML 树修改与函数构造
就地修改 XML 树是更改 XML 文档形状的传统方法。 典型的应用程序将文档加载到数据存储区(如 DOM 或 LINQ to XML);使用编程接口插入节点、删除节点或更改节点的内容;然后将 XML 保存到文件或通过网络传输。
LINQ to XML 允许使用另一种可在许多方案中使用的方法:函数构造。 函数构造将修改数据视为转换问题,而不是数据存储区的具体操作。 如果您采用某种数据表示形式并有效地将其从一种形式转换为另一种形式,其结果等效于您采用一个数据存储区并对其以某种方式进行操作以采用另一种形状。 函数构造方法的关键是将查询的结果传递给 XDocument 和 XElement 构造函数。
此示例假设您想修改下面的简单 XML 文档,使属性变为元素。 本节首先介绍传统的就地修改方法。 然后显示函数构造方法。XML文件:
xml version="1.0" encoding="utf-8" ?>
<Root Data1="123" Data2="456">
  <Child1>ContentChild1>
Root>
您可以编写一些过程代码以便从属性创建元素,然后删除属性,如下所示:
XElement root = XElement.Load("Data.xml");
foreach (XAttribute att in root.Attributes()) {
    root.Add(new XElement(att.Name, (string)att));
}
root.Attributes().Remove();
Console.WriteLine(root);
输出结果为:
<Root>
  <Child1>ContentChild1>
  <Data1>123Data1>
  <Data2>456Data2>
Root>
 
函数构造方法
相比之下,函数方法包含用于形成新树的代码、从源树中选择元素和属性并在将其添加到新树中时进行相应的转换。 函
数方法如下所示:
XElement root = XElement.Load("Data.xml");
XElement newTree = new XElement("Root",
    root.Element("Child1"),
    from att in root.Attributes()
    select new XElement(att.Name, (string)att)
);
Console.WriteLine(newTree);
 
在本例中,函数示例一点也不比第一个示例简短,而且一点也不比第一个示例简单。 但如果要对一个 XML 树进行很多
更改,则非函数方法将变得非常复杂,而且会显得很笨拙。 相比之下,使用函数方法时,您只需形成所需的 XML,嵌
入适当的查询和表达式以提取需要的内容。 函数方法生成的代码更易于维护。
 
请注意,在本例中,函数方法的执行效果可能没有树操作方法好。 主要问题是函数方法创建了更多短生存期的对象。
但是,如果使用函数方法能够提高程序员的效率,则折中也是一种有效的方式。
 
这是一个很简单的示例,但它显示了这两种方法之间基本原理上的差异。 对于转换较大的 XML 文档,函数方法可以产
生更高的效率增益。
 
 
 
向 XML 树中添加元素、属性和节点
 
下面的方法将子内容添加到 XElement 或 XDocument 中:
 
方法                 说明
 
Add                  在 XContainer 的子内容的末尾添加内容。
 
AddFirst           在 XContainer 的子内容的开头添加内容。
 
下面的方法将内容添加为 XNode 的同级节点。 向其中添加同级内容的最常见的节点是 XElement,不过你也可以将有
效的同级内容添加到其他类型的节点,例如 XText 或 XComment。
 
方法                         说明
 
AddAfterSelf            在 XNode 后面添加内容。
 
AddBeforeSelf          在 XNode 前面添加内容。
 
示例:
 
XElement srcTree = new XElement("Root",
    new XElement("Element1", 1),
    new XElement("Element2", 2),
    new XElement("Element3", 3),
    new XElement("Element4", 4),
    new XElement("Element5", 5)
);
XElement xmlTree = new XElement("Root",
    new XElement("Child1", 1),
    new XElement("Child2", 2),
    new XElement("Child3", 3),
    new XElement("Child4", 4),
    new XElement("Child5", 5)
);
xmlTree.Add(new XElement("NewChild", "new content"));
xmlTree.Add(
    from el in srcTree.Elements()
    where (int)el > 3
    select el
);
// Even though Child9 does not exist in srcTree, the following statement will not
// throw an exception, and nothing will be added to xmlTree.
xmlTree.Add(srcTree.Element("Child9"));
Console.WriteLine(xmlTree);
 
输出结果:
 
<Root>
  <Child1>1Child1>
  <Child2>2Child2>
  <Child3>3Child3>
  <Child4>4Child4>
  <Child5>5Child5>
  <NewChild>new contentNewChild>
  <Element4>4Element4>
  <Element5>5Element5>
Root>
 
 
 
修改 XML 树中的元素、属性和节点
 
 
 
下表汇总了修改元素、元素的子元素或元素属性 (Attribute) 时可以使用的方法和属性 (Property)。
 
下面的方法修改 XElement。
 
 
方法 说明
XElement..::.Parse 用已分析的 XML 替换元素。
XElement..::.RemoveAll 移除元素的所有内容(子节点和属性)。
XElement..::.RemoveAttributes 移除元素的属性。
XElement..::.ReplaceAll 替换元素的所有内容(子节点和属性)。
XElement..::.ReplaceAttributes 替换元素的属性。
XElement..::.SetAttributeValue 设置属性的值。 如果该属性不存在,则创建该属性。 如果值设置为 null,则移除该属性。
XElement..::.SetElementValue 设置子元素的值。 如果该元素不存在,则创建该元素。 如果值设置为 null,则移除该元素。
XElement..::.Value 用指定的文本替换元素的内容(子节点)。
XElement..::.SetValue 设置元素的值。
 
 
下面的方法修改 XAttribute。
 
 
方法 说明
XAttribute..::.Value 设置属性的值。
XAttribute..::.SetValue 设置属性的值。
 
 
下面的方法修改 XNode(包括 XElement 或 XDocument)。
 
 
方法 说明
XNode..::.ReplaceWith 用新内容替换节点。
 
 
下面的方法修改 XContainer(XElement 或 XDocument)。
 
 
方法 说明
XContainer..::.ReplaceNodes 用新内容替换子节点。
 


 
 XElement.SetElementValue 方法
 
此方法旨在简化将名称/值对列表用作子元素集时的维护。维护列表时,需要添加对、修改对或删除对。
如果调用此方法将不存在的名称作为子元素传递,则此方法会为您创建一个子元素。如果您调用此方
法来传递一个现有子元素的名称,则此方法会将此子元素的值更改为指定的值。如果您为 value 传递
了 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing),则此方法会移除子元素。
 
// Create an element with no content
XElement root = new XElement("Root");
 
// Add some name/value pairs.
root.SetElementValue("Ele1", 1);
root.SetElementValue("Ele2", 2);
root.SetElementValue("Ele3", 3);
Console.WriteLine(root);
 
// Modify one of the name/value pairs.
root.SetElementValue("Ele2", 22);
Console.WriteLine(root);
 
// Remove one of the name/value pairs.
root.SetElementValue("Ele3", null);
Console.WriteLine(root);
 
输出结果:
 
<Root>
  <Ele1>1Ele1>
  <Ele2>2Ele2>
  <Ele3>3Ele3>
Root>
<Root>
  <Ele1>1Ele1>
  <Ele2>22Ele2>
  <Ele3>3Ele3>
Root>
<Root>
  <Ele1>1Ele1>
  <Ele2>22Ele2>
Root>
 
 
 
XElement.SetAttributeValue 方法
 
此方法旨在简化将名称/值对列表用作属性集时的维护。维护列表时,需要添加对、修改对或删除对。
如果调用此方法将不存在的名称作为属性传递,则此方法会为您创建一个属性。如果调用此方法来传递
现有属性的名称,则此方法将会属性的值修改为指定的值。如果您为 value 传递了
nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing),则此方法会移除该属性。
 
此方法将引发 Changed 和 Changing 事件。
 
将值分配给具有指定名称的属性。如果不存在具有指定名称的属性,则添加新属性。如果值为
nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing),则删除具有指定名称的属
性(如果存在)。
 
// Create an element with no content.
XElement root = new XElement("Root");
 
// Add some name/value pairs.
root.SetAttributeValue("Att1", 1);
root.SetAttributeValue("Att2", 2);
root.SetAttributeValue("Att3", 3);
Console.WriteLine(root);
 
// Modify one of the name/value pairs.
root.SetAttributeValue("Att2", 22);
Console.WriteLine(root);
 
// Remove one of the name/value pairs.
root.SetAttributeValue("Att3", null);
Console.WriteLine(root);
 
输出结果为:
 
<Root Att1="1" Att2="2" Att3="3" />
<Root Att1="1" Att2="22" Att3="3" />
<Root Att1="1" Att2="22" />
 
XNode.ReplaceWith 方法
使用指定的内容替换此节点。
XElement xmlTree = new XElement("Root",
    new XElement("Child1", "child1 content"),
    new XElement("Child2", "child2 content"),
    new XElement("Child3", "child3 content"),
    new XElement("Child4", "child4 content"),
    new XElement("Child5", "child5 content")
);
XElement child3 = xmlTree.Element("Child3");
child3.ReplaceWith(
    new XElement("NewChild", "new content")
);
Console.WriteLine(xmlTree);
 
输出结果:
 
<Root>
  <Child1>child1 contentChild1>
  <Child2>child2 contentChild2>
  <NewChild>new contentNewChild>
  <Child4>child4 contentChild4>
  <Child5>child5 contentChild5>
Root>
 
从 XML 树中移除元素、属性和节点
 
可以修改 XML 树,移除元素、属性和其他类型的节点。
 
从 XML 文档中移除单个元素或单个属性的操作非常简单。 但是,若要移除多个元素或属性的集合,则
应首先将一个集合具体化为一个列表,然后从该列表中删除相应元素或属性。 最好的方法是使用
Remove 扩展方法,该方法可以实现此操作。
 
这么做的主要原因在于,从 XML 树检索的大多数集合都是用延迟执行生成的。 如果不首先将集合具体
化为列表,或者不使用扩展方法,则可能会遇到某类 Bug。
 
 
 

示例:
 
此示例演示三种移除元素的方法。 第一种,移除单个元素。 第二种,检索元素的集合,使用
Enumerable.ToList<(Of <(TSource>)>) 运算符将它们具体化,然后移除集合。 最后一种,检索
元素的集合,使用 Remove 扩展方法移除元素。
 
XElement root = XElement.Parse(@" 
");
root.Element("Child1").Element("GrandChild1").Remove();
root.Element("Child2").Elements().ToList().Remove();
root.Element("Child3").Elements().Remove();
Console.WriteLine(root);
 
输出结果为:
 
<Root>
  <Child1>
    <GrandChild2 />
    <GrandChild3 />
  Child1>
  <Child2 />
  <Child3 />
Root>
 
View Code

c# xml操作类

引子http://www.cnblogs.com/QDuck/archive/2007/01/10/617240.aspx


public class XmlControl
 {
  protected string strXmlFile;
  protected XmlDocument objXmlDoc = new XmlDocument();
 
  public XmlControl(string XmlFile)
  {
   //
   // TODO: 在這裡加入建構函式的程式碼
   //
   try
   {
    objXmlDoc.Load(XmlFile);
   }
   catch (System.Exception ex)
   {
    throw ex;
   }
   strXmlFile = XmlFile;
  }
  public DataView GetData(string XmlPathNode)
  {
   //查找數據。返回一個DataView
   DataSet ds = new DataSet();
   StringReader read = new StringReader(objXmlDoc.SelectSingleNode(XmlPathNode).OuterXml);
   ds.ReadXml(read);
   return ds.Tables[0].DefaultView;
  }
  public void Replace(string XmlPathNode,string Content)
  {
   //更新節點內容。
   objXmlDoc.SelectSingleNode(XmlPathNode).InnerText = Content;
  }
  public void Delete(string Node)
  {
   //刪除一個節點。
   string mainNode = Node.Substring(0,Node.LastIndexOf("/"));
   objXmlDoc.SelectSingleNode(mainNode).RemoveChild(objXmlDoc.SelectSingleNode(Node));
  }
  public void InsertNode(string MainNode,string ChildNode,string Element,string Content)
  {
   //插入一節點和此節點的一子節點。
   XmlNode objRootNode = objXmlDoc.SelectSingleNode(MainNode);
   XmlElement objChildNode = objXmlDoc.CreateElement(ChildNode);
   objRootNode.AppendChild(objChildNode);
   XmlElement objElement = objXmlDoc.CreateElement(Element);
   objElement.InnerText = Content;
   objChildNode.AppendChild(objElement);
  }
  public void InsertElement(string MainNode,string Element,string Attrib,string AttribContent,string Content)
  {
   //插入一個節點,帶一屬性。
   XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode);
   XmlElement objElement = objXmlDoc.CreateElement(Element);
   objElement.SetAttribute(Attrib,AttribContent);
   objElement.InnerText = Content;
   objNode.AppendChild(objElement);
  }
  public void InsertElement(string MainNode,string Element,string Content)
  {
   //插入一個節點,不帶屬性。
   XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode);
   XmlElement objElement = objXmlDoc.CreateElement(Element);
   objElement.InnerText = Content;
   objNode.AppendChild(objElement);
  }
  public void Save()
  {
   //保存文檔。
   try
   {
    objXmlDoc.Save(strXmlFile);
   }
   catch (System.Exception ex)
   {
    throw ex;
   }
   objXmlDoc = null;
  }
 }
=========================================================
实例应用:
   string strXmlFile = Server.MapPath("TestXml.xml");
   XmlControl xmlTool = new XmlControl(strXmlFile);
//   數據顯視
//   dgList.DataSource = xmlTool.GetData("Book/Authors[ISBN="0002"]");
//   dgList.DataBind();
//   更新元素內容
//   xmlTool.Replace("Book/Authors[ISBN="0002"]/Content","ppppppp");
//   xmlTool.Save();
//   添加一個新節點
//   xmlTool.InsertNode("Book","Author","ISBN","0004");
//   xmlTool.InsertElement("Book/Author[ISBN="0004"]","Content","aaaaaaaaa");
//   xmlTool.InsertElement("Book/Author[ISBN="0004"]","Title","Sex","man","iiiiiiii");
//   xmlTool.Save();
//   刪除一個指定節點的所有內容和屬性
//   xmlTool.Delete("Book/Author[ISBN="0004"]");
//   xmlTool.Save();
//   刪除一個指定節點的子節點
//   xmlTool.Delete("Book/Authors[ISBN="0003"]");
//   xmlTool.Save();



  1

<2

Class XMLDOMDocument
  3

Private fNode,fANode
  4

Private fErrInfo,fFileName,fOpen
  5

Dim XmlDom
  6


  7

'返回节点的缩进字串
  8

Private Property Get TabStr(byVal Node)
  9

TabStr=""
 10

If Node Is Nothing Then Exit Property
 11

If not Node.parentNode Is nothing Then TabStr=" "&TabStr(Node.parentNode)
 12

End Property
 13


 14

'返回一个子节点对象,ElementOBJ为父节点,ChildNodeObj要查找的节点,IsAttributeNode指出是否为属性对象
 15

Public Property Get ChildNode(byVal ElementOBJ,byVal ChildNodeObj,byVal IsAttributeNode)
 16

Dim Element
 17

Set ChildNode=Nothing
 18


 19

If IsNull(ChildNodeObj) Then
 20

If IsAttributeNode=false Then
 21

Set ChildNode=fNode
 22

Else
 23

Set ChildNode=fANode
 24

End If
 25

Exit Property
 26

ElseIf IsObject(ChildNodeObj) Then
 27

Set ChildNode=ChildNodeObj
 28

Exit Property
 29

End If
 30


 31

Set Element=Nothing
 32

If LCase(TypeName(ChildNodeObj))="string" and Trim(ChildNodeObj)<>"" Then
 33

If IsNull(ElementOBJ) Then
 34

Set Element=fNode
 35

ElseIf LCase(TypeName(ElementOBJ))="string" Then
 36

If Trim(ElementOBJ)<>"" Then
 37

Set Element=XmlDom.selectSingleNode("//"&Trim(ElementOBJ))
 38

If Lcase(Element.nodeTypeString)="attribute" Then Set Element=Element.selectSingleNode("..")
 39

End If
 40

ElseIf IsObject(ElementOBJ) Then
 41

Set Element=ElementOBJ
 42

End If
 43


 44

If Element Is Nothing Then
 45

Set ChildNode=XmlDom.selectSingleNode("//"&Trim(ChildNodeObj))
 46

ElseIf IsAttributeNode=true Then
 47

Set ChildNode=Element.selectSingleNode("./@"&Trim(ChildNodeObj))
 48

Else
 49

Set ChildNode=Element.selectSingleNode("./"&Trim(ChildNodeObj))
 50

End If
 51

End If
 52

End Property
 53


 54

'读取最后的错误信息
 55

Public Property Get ErrInfo
 56

ErrInfo=fErrInfo
 57

End Property
 58


 59

'给xml内容
 60

Public Property Get xmlText(byVal ElementOBJ)
 61

xmlText=""
 62

If fopen=false Then Exit Property
 63


 64

Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
 65

If ElementOBJ Is Nothing Then Set ElementOBJ=XmlDom
 66


 67

xmlText=ElementOBJ.xml
 68

End Property
 69


 70

'=================================================================
 71

'类初始化
 72

Private Sub Class_Initialize()
 73

Set XmlDom=CreateObject("Microsoft.XMLDOM")
 74

XmlDom.preserveWhiteSpace=true
 75


 76

Set fNode=Nothing
 77

Set fANode=Nothing
 78


 79

fErrInfo=""
 80

fFileName=""
 81

fopen=false
 82

End Sub
 83


 84

'类释放
 85

Private Sub Class_Terminate()
 86

Set fNode=Nothing
 87

Set fANode=Nothing
 88

Set XmlDom=nothing
 89

fopen=false
 90

End Sub
 91


 92

'=====================================================================
 93

'建立一个XML文件,RootElementName:根结点名。XSLURL:使用XSL样式地址
 94

'返回根结点
 95

Function Create(byVal RootElementName,byVal XslUrl)
 96

Dim PINode,RootElement
 97


 98

Set Create=Nothing
 99


100

If (XmlDom Is Nothing) Or (fopen=true) Then Exit Function
101


102

If Trim(RootElementName)="" Then RootElementName="Root"
103


104

Set PINode=XmlDom.CreateProcessingInstruction("xml", "version=""1.0"" encoding=""GB2312""")
105

XmlDom.appendChild PINode
106


107

Set PINode=XMLDOM.CreateProcessingInstruction("xml-stylesheet", "type=""text/xsl"" href="""&XslUrl&"""")
108

XmlDom.appendChild PINode
109


110

Set RootElement=XmlDom.createElement(Trim(RootElementName))
111

XmlDom.appendChild RootElement
112


113

Set Create=RootElement
114


115

fopen=True
116

set fNode=RootElement
117

End Function
118


119

'开打一个已经存在的XML文件,返回打开状态
120

Function Open(byVal xmlSourceFile)
121

Open=false
122


123

xmlSourceFile=Trim(xmlSourceFile)
124

If xmlSourceFile="" Then Exit Function
125


126

XmlDom.async = false
127

XmlDom.load xmlSourceFile
128


129

fFileName=xmlSourceFile
130


131

If not IsError Then
132

Open=true
133

fopen=true
134

End If
135

End Function
136


137

'关闭
138

Sub Close()
139

Set fNode=Nothing
140

Set fANode=Nothing
141


142

fErrInfo=""
143

fFileName=""
144

fopen=false
145

End Sub
146


147

'读取一个NodeOBJ的节点Text的值
148

'NodeOBJ可以是节点对象或节点名,为null就取当前默认fNode
149

Function getNodeText(byVal NodeOBJ)
150

getNodeText=""
151

If fopen=false Then Exit Function
152


153

Set NodeOBJ=ChildNode(null,NodeOBJ,false)
154

If NodeOBJ Is Nothing Then Exit Function
155


156

If Lcase(NodeOBJ.nodeTypeString)="element" Then
157

set fNode=NodeOBJ
158

Else
159

set fANode=NodeOBJ
160

End If
161

getNodeText=NodeOBJ.text
162

End function
163


164

'插入在BefelementOBJ下面一个名为ElementName,Value为ElementText的子节点。
165

'IsFirst:是否插在第一个位置;IsCDATA:说明节点的值是否属于CDATA类型
166

'插入成功就返回新插入这个节点
167

'BefelementOBJ可以是对象也可以是节点名,为null就取当前默认对象
168

Function InsertElement(byVal BefelementOBJ,byVal ElementName,byVal ElementText,byVal IsFirst,byVal IsCDATA)
169

Dim Element,TextSection,SpaceStr
170

Set InsertElement=Nothing
171


172

If not fopen Then Exit Function
173


174

Set BefelementOBJ=ChildNode(XmlDom,BefelementOBJ,false)
175

If BefelementOBJ Is Nothing Then Exit Function
176


177

Set Element=XmlDom.CreateElement(Trim(ElementName))
178


179

'SpaceStr=vbCrLf&TabStr(BefelementOBJ)
180

'Set STabStr=XmlDom.CreateTextNode(SpaceStr)
181


182

'If Len(SpaceStr)>2 Then SpaceStr=Left(SpaceStr,Len(SpaceStr)-2)
183

'Set ETabStr=XmlDom.CreateTextNode(SpaceStr)
184


185

If IsFirst=true Then
186

'BefelementOBJ.InsertBefore ETabStr,BefelementOBJ.firstchild
187

BefelementOBJ.InsertBefore Element,BefelementOBJ.firstchild
188

'BefelementOBJ.InsertBefore STabStr,BefelementOBJ.firstchild
189

Else
190

'BefelementOBJ.appendChild STabStr
191

BefelementOBJ.appendChild Element
192

'BefelementOBJ.appendChild ETabStr
193

End If
194


195

If IsCDATA=true Then
196

set TextSection=XmlDom.createCDATASection(ElementText)
197

Element.appendChild TextSection
198

ElseIf ElementText<>"" Then
199

Element.Text=ElementText
200

End If
201


202

Set InsertElement=Element
203

Set fNode=Element
204

End Function
205


206

'在ElementOBJ节点上插入或修改名为AttributeName,值为:AttributeText的属性
207

'如果已经存在名为AttributeName的属性对象,就进行修改。
208

'返回插入或修改属性的Node
209

'ElementOBJ可以是Element对象或名,为null就取当前默认对象
210

Function setAttributeNode(byVal ElementOBJ,byVal AttributeName,byVal AttributeText)
211

Dim AttributeNode
212

Set setAttributeNode=nothing
213


214

If not fopen Then Exit Function
215


216

Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
217

If ElementOBJ Is Nothing Then Exit Function
218


219

Set AttributeNode=ElementOBJ.attributes.getNamedItem(AttributeName)
220

If AttributeNode Is nothing Then
221

Set AttributeNode=XmlDom.CreateAttribute(AttributeName)
222

ElementOBJ.setAttributeNode AttributeNode
223

End If
224

AttributeNode.text=AttributeText
225


226

set fNode=ElementOBJ
227

set fANode=AttributeNode
228

Set setAttributeNode=AttributeNode
229

End Function
230


231

'修改ElementOBJ节点的Text值,并返回这个节点
232

'ElementOBJ可以对象或对象名,为null就取当前默认对象
233

Function UpdateNodeText(byVal ElementOBJ,byVal NewElementText,byVal IsCDATA)
234

Dim TextSection
235


236

set UpdateNodeText=nothing
237

If not fopen Then Exit Function
238


239

Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
240

If ElementOBJ Is Nothing Then Exit Function
241


242

If IsCDATA=true Then
243

set TextSection=XmlDom.createCDATASection(NewElementText)
244

If ElementOBJ.firstchild Is Nothing Then
245

ElementOBJ.appendChild TextSection
246

ElseIf LCase(ElementOBJ.firstchild.nodeTypeString)="cdatasection" Then
247

ElementOBJ.replaceChild TextSection,ElementOBJ.firstchild
248

End If
249

Else
250

ElementOBJ.Text=NewElementText
251

End If
252


253

set fNode=ElementOBJ
254

Set UpdateNodeText=ElementOBJ
255

End Function
256


257

'返回符合testValue条件的第一个ElementNode,为null就取当前默认对象
258

Function getElementNode(byVal ElementName,byVal testValue)
259

Dim Element,regEx,baseName
260


261

Set getElementNode=nothing
262

If not fopen Then Exit Function
263


264

testValue=Trim(testValue)
265

Set regEx=New RegExp
266

regEx.Pattern="^[A-Za-z]+"
267

regEx.IgnoreCase=true
268

If regEx.Test(testValue) Then testValue="/"&testValue
269

Set regEx=nothing
270


271

baseName=LCase(Right(ElementName,Len(ElementName)-InStrRev(ElementName,"/",-1)))
272


273

Set Element=XmlDom.SelectSingleNode("//"&ElementName&testValue)
274


275

If Element Is Nothing Then
276

'Response.write ElementName&testValue
277

Set getElementNode=nothing
278

Exit Function
279

End If
280


281

Do While LCase(Element.baseName)<>baseName
282

Set Element=Element.selectSingleNode("..")
283

If Element Is Nothing Then Exit Do
284

Loop
285


286

If LCase(Element.baseName)<>baseName Then
287

Set getElementNode=nothing
288

Else
289

Set getElementNode=Element
290

If Lcase(Element.nodeTypeString)="element" Then
291

Set fNode=Element
292

Else
293

Set fANode=Element
294

End If
295

End If
296

End Function
297


298

'删除一个子节点
299

Function removeChild(byVal ElementOBJ)
300

removeChild=false
301

If not fopen Then Exit Function
302


303

Set ElementOBJ=ChildNode(null,ElementOBJ,false)
304

If ElementOBJ Is Nothing Then Exit Function
305


306

'response.write ElementOBJ.baseName
307


308

If Lcase(ElementOBJ.nodeTypeString)="element" Then
309

If ElementOBJ Is fNode Then set fNode=Nothing
310

If ElementOBJ.parentNode Is Nothing Then
311

XmlDom.removeChild(ElementOBJ)
312

Else
313

ElementOBJ.parentNode.removeChild(ElementOBJ)
314

End If
315

removeChild=True
316

End If
317

End Function
318


319

'清空一个节点所有子节点
320

Function ClearNode(byVal ElementOBJ)
321

set ClearNode=Nothing
322

If not fopen Then Exit Function
323


324

Set ElementOBJ=ChildNode(null,ElementOBJ,false)
325

If ElementOBJ Is Nothing Then Exit Function
326


327

ElementOBJ.text=""
328

ElementOBJ.removeChild(ElementOBJ.firstchild)
329


330

Set ClearNode=ElementOBJ
331

Set fNode=ElementOBJ
332

End Function
333


334

'删除子节点的一个属性
335

Function removeAttributeNode(byVal ElementOBJ,byVal AttributeOBJ)
336

removeAttributeNode=false
337

If not fopen Then Exit Function
338


339

Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false)
340

If ElementOBJ Is Nothing Then Exit Function
341


342

Set AttributeOBJ=ChildNode(ElementOBJ,AttributeOBJ,true)
343

If not AttributeOBJ Is nothing Then
344
View Code

c#读写xml文件

c#读写xml文件
已知有一个XML文件(bookstore.xml)如下:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
  <book genre="fantasy" ISBN="2-3631-4">
    <title>Oberon's Legacy</title>
    <author>Corets, Eva</author>
    <price>5.95</price>
  </book>
</bookstore>
 
1、往<bookstore>节点中插入一个<book>节点:
   XmlDocument xmlDoc=new XmlDocument();
   xmlDoc.Load("bookstore.xml");
   XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
   XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点
   xe1.SetAttribute("genre","李赞红");//设置该节点genre属性
   xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性
 
   XmlElement xesub1=xmlDoc.CreateElement("title");
   xesub1.InnerText="CS从入门到精通";//设置文本节点
   xe1.AppendChild(xesub1);//添加到<book>节点中
   XmlElement xesub2=xmlDoc.CreateElement("author");
   xesub2.InnerText="候捷";
   xe1.AppendChild(xesub2);
   XmlElement xesub3=xmlDoc.CreateElement("price");
   xesub3.InnerText="58.3";
   xe1.AppendChild(xesub3);
 
   root.AppendChild(xe1);//添加到<bookstore>节点中
   xmlDoc.Save("bookstore.xml");
//===============================================
结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
  <book genre="fantasy" ISBN="2-3631-4">
    <title>Oberon's Legacy</title>
    <author>Corets, Eva</author>
    <price>5.95</price>
  </book>
  <book genre="李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </book>
</bookstore>
 
2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。
    XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点
   foreach(XmlNode xn in nodeList)//遍历所有子节点
   {
    XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
    if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红”
    {
     xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红”
 
     XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
     foreach(XmlNode xn1 in nls)//遍历
     {
      XmlElement xe2=(XmlElement)xn1;//转换类型
      if(xe2.Name=="author")//如果找到
      {
       xe2.InnerText="亚胜";//则修改
       break;//找到退出来就可以了
      }
     }
     break;
    }
   }
 
   xmlDoc.Save("bookstore.xml");//保存。
//==================================================
最后结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
  <book genre="fantasy" ISBN="2-3631-4">
    <title>Oberon's Legacy</title>
    <author>Corets, Eva</author>
    <price>5.95</price>
  </book>
  <book genre="update李赞红" ISBN="2-3631-4">
    <title>CS从入门到精通</title>
    <author>亚胜</author>
    <price>58.3</price>
  </book>
</bookstore>
 
3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。
XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
 
   foreach(XmlNode xn in xnl)
   {
    XmlElement xe=(XmlElement)xn;
    if(xe.GetAttribute("genre")=="fantasy")
    {
     xe.RemoveAttribute("genre");//删除genre属性
    }
    else if(xe.GetAttribute("genre")=="update李赞红")
    {
     xe.RemoveAll();//删除该节点的全部内容
    }
   }
   xmlDoc.Save("bookstore.xml");
//===========================================
最后结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
  <book ISBN="2-3631-4">
    <title>Oberon's Legacy</title>
    <author>Corets, Eva</author>
    <price>5.95</price>
  </book>
  <book>
  </book>
</bookstore>
 
4、显示所有数据。
   XmlNode xn=xmlDoc.SelectSingleNode("bookstore");
 
   XmlNodeList xnl=xn.ChildNodes;
   
   foreach(XmlNode xnf in xnl)
   {
    XmlElement xe=(XmlElement)xnf;
    Console.WriteLine(xe.GetAttribute("genre"));//显示属性值
    Console.WriteLine(xe.GetAttribute("ISBN"));
 
    XmlNodeList xnf1=xe.ChildNodes;
    foreach(XmlNode xn2 in xnf1)
    {
     Console.WriteLine(xn2.InnerText);//显示子节点点文本
    }
   }
View Code

C#:XML操作类

写的一个XML操作类,包括读取/插入/修改/删除。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
namespace PuTianCheng
{
    /// <summary>
    /// XmlHelper 的摘要说明
    /// </summary>
    public class XmlHelper
    {
        public XmlHelper()
        {
        }
        /// <summary>
        /// 读取数据
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="node">节点</param>
        /// <param name="attribute">属性名,非空时返回该属性值,否则返回串联值</param>
        /// <returns>string</returns>
        /**************************************************
         * 使用示列:
         * XmlHelper.Read(path, "/Node", "")
         * XmlHelper.Read(path, "/Node/Element[@Attribute='Name']", "Attribute")
         ************************************************/
        public static string Read(string path, string node, string attribute)
        {
            string value = "";
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(path);
                XmlNode xn = doc.SelectSingleNode(node);
                value = (attribute.Equals("") ? xn.InnerText : xn.Attributes[attribute].Value);
            }
            catch { }
            return value;
        }
        /// <summary>
        /// 插入数据
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="node">节点</param>
        /// <param name="element">元素名,非空时插入新元素,否则在该元素中插入属性</param>
        /// <param name="attribute">属性名,非空时插入该元素属性值,否则插入元素值</param>
        /// <param name="value"></param>
        /// <returns></returns>
        /**************************************************
         * 使用示列:
         * XmlHelper.Insert(path, "/Node", "Element", "", "Value")
         * XmlHelper.Insert(path, "/Node", "Element", "Attribute", "Value")
         * XmlHelper.Insert(path, "/Node", "", "Attribute", "Value")
         ************************************************/
        public static void Insert(string path, string node, string element, string attribute, string value)
        {
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(path);
                XmlNode xn = doc.SelectSingleNode(node);
                if (element.Equals(""))
                {
                    if (!attribute.Equals(""))
                    {
                        XmlElement xe = (XmlElement)xn;
                        xe.SetAttribute(attribute, value);
                    }
                }
                else
                {
                    XmlElement xe = doc.CreateElement(element);
                    if (attribute.Equals(""))
                        xe.InnerText = value;
                    else
                        xe.SetAttribute(attribute, value);
                    xn.AppendChild(xe);
                }
                doc.Save(path);
            }
            catch { }
        }
        /// <summary>
        /// 修改数据
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="node">节点</param>
        /// <param name="attribute">属性名,非空时修改该节点属性值,否则修改节点值</param>
        /// <param name="value"></param>
        /// <returns></returns>
        /**************************************************
         * 使用示列:
         * XmlHelper.Insert(path, "/Node", "", "Value")
         * XmlHelper.Insert(path, "/Node", "Attribute", "Value")
         ************************************************/
        public static void Update(string path, string node, string attribute, string value)
        {
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(path);
                XmlNode xn = doc.SelectSingleNode(node);
                XmlElement xe = (XmlElement)xn;
                if (attribute.Equals(""))
                    xe.InnerText = value;
                else
                    xe.SetAttribute(attribute, value);
                doc.Save(path);
            }
            catch { }
        }
        /// <summary>
        /// 删除数据
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="node">节点</param>
        /// <param name="attribute">属性名,非空时删除该节点属性值,否则删除节点值</param>
        /// <param name="value"></param>
        /// <returns></returns>
        /**************************************************
         * 使用示列:
         * XmlHelper.Delete(path, "/Node", "")
         * XmlHelper.Delete(path, "/Node", "Attribute")
         ************************************************/
        public static void Delete(string path, string node, string attribute)
        {
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(path);
                XmlNode xn = doc.SelectSingleNode(node);
                XmlElement xe = (XmlElement)xn;
                if (attribute.Equals(""))
                    xn.ParentNode.RemoveChild(xn);
                else
                    xe.RemoveAttribute(attribute);
                doc.Save(path);
            }
            catch { }
        }
    }
}
==================================================
XmlFile.xml:
<?xml version="1.0" encoding="utf-8"?>
<Root />
==================================================
使用方法:
string xml = Server.MapPath("XmlFile.xml");
//插入元素
//XmlHelper.Insert(xml, "/Root", "Studio", "", "");
//插入元素/属性
//XmlHelper.Insert(xml, "/Root/Studio", "Site", "Name", "小路工作室");
//XmlHelper.Insert(xml, "/Root/Studio", "Site", "Name", "丁香鱼工作室");
//XmlHelper.Insert(xml, "/Root/Studio", "Site", "Name", "谱天城工作室");
//XmlHelper.Insert(xml, "/Root/Studio/Site[@Name='谱天城工作室']", "Master", "", "红尘静思");
//插入属性
//XmlHelper.Insert(xml, "/Root/Studio/Site[@Name='小路工作室']", "", "Url", "http://www.wzlu.com/");
//XmlHelper.Insert(xml, "/Root/Studio/Site[@Name='丁香鱼工作室']", "", "Url", "http://www.luckfish.net/");
//XmlHelper.Insert(xml, "/Root/Studio/Site[@Name='谱天城工作室']", "", "Url", "http://www.putiancheng.com/");
//修改元素值
//XmlHelper.Update(xml, "/Root/Studio/Site[@Name='谱天城工作室']/Master", "", "RedDust");
//修改属性值
//XmlHelper.Update(xml, "/Root/Studio/Site[@Name='谱天城工作室']", "Url", "http://www.putiancheng.net/");
//XmlHelper.Update(xml, "/Root/Studio/Site[@Name='谱天城工作室']", "Name", "PuTianCheng Studio");
//读取元素值
//Response.Write("<div>" + XmlHelper.Read(xml, "/Root/Studio/Site/Master", "") + "</div>");
//读取属性值
//Response.Write("<div>" + XmlHelper.Read(xml, "/Root/Studio/Site", "Url") + "</div>");
//读取特定属性值
//Response.Write("<div>" + XmlHelper.Read(xml, "/Root/Studio/Site[@Name='丁香鱼工作室']", "Url") + "</div>");
//删除属性
//XmlHelper.Delete(xml, "/Root/Studio/Site[@Name='小路工作室']", "Url");
//删除元素
//XmlHelper.Delete(xml, "/Root/Studio", "");
 
View Code
原文地址:https://www.cnblogs.com/blogpro/p/11457027.html