1 c# xml操作(二) 此博文包含图片 (2011-05-05 14:58:36)转载▼ 2 标签: 杂谈 分类: c# 3 上次,我们介绍了增加和删除xml的一些操作,这次我们将介绍如何更改和读取xml特定节点。我们依然以上次的xml文件为例: 4 <?xml version="1.0" encoding="utf-8"?> 5 <phonebook> 6 <member id="6"> 7 <name>456</name> 8 <qq>5465</qq> 9 </member> 10 <member id="5"> 11 <name>jjjjj</name> 12 <qq>3456789</qq> 13 </member> 14 </phonebook> 15 16 首先是更改操作,它也包含两个方面即更改指定节点的值和指定节点的某一属性值,我们可以使用的方法如下: 17 /// <summary> 18 /// 更新Xml节点内容 19 /// </summary> 20 /// <param name="xmlPath">xml路径</param> 21 /// <param name="Node">要更换内容的节点:节点路径 根节点/父节点/当前节点</param> 22 /// <param name="Content">新的内容</param> 23 public static void XmlNodeReplace(string xmlPath, string Node, string Content) 24 { 25 XmlDocument objXmlDoc = new XmlDocument(); 26 objXmlDoc.Load(xmlPath); 27 objXmlDoc.SelectSingleNode(Node).InnerText = Content; 28 objXmlDoc.Save(xmlPath); 29 30 } 31 32 /// <summary> 33 /// 更改节点的属性值 34 /// </summary> 35 /// <param name="xmlPath">文件路径</param> 36 /// <param name="NodePath">节点路径</param> 37 /// <param name="NodeAttribute1">要更改的节点属性的名称</param> 38 /// <param name="NodeAttributeText">更改的属性值</param> 39 public static void XmlAttributeEide(string xmlPath, string NodePath, string NodeAttribute1, string NodeAttributeText) 40 { 41 XmlDocument objXmlDoc = new XmlDocument(); 42 objXmlDoc.Load(xmlPath); 43 XmlNode nodePath = objXmlDoc.SelectSingleNode(NodePath); 44 XmlElement xe = (XmlElement)nodePath; 45 xe.SetAttribute(NodeAttribute1, NodeAttributeText); 46 objXmlDoc.Save(xmlPath); 47 48 } 49 50 第一个方面,加入我们要更改menber(id=6)下节点name的值我们可以这样做: 51 string xmlPath = Server.MapPath("~/test.xml"); 52 53 XmlHelper.XmlNodeReplace(xmlPath, "//member[@id=6]/name" ,"hya"); 54 也可以 55 string xmlPath = Server.MapPath("~/test.xml"); 56 57 XmlHelper.XmlNodeReplace(xmlPath, "//member[qq='5465']/name" ,"hya"); 58 总之你能够用xpath语法找到所要更改的节点即可。 59 更改属性值也一样,在这不在赘述! 60 查询正如对数据库操作查询考查你对sql的熟练程度一样,对xml的查询也就是考查你对xpath了解多少。在这里我只是列出几个有限的调用方法,相信从上面的介绍中你可以大致对xpath有了一定的了解: 61 62 #region 读取XML到DataSet 63 /// <summary> 64 /// 功能:读取XML到DataSet中 65 /// </summary> 66 /// <param name="XmlPath">xml路径</param> 67 /// <returns>DataSet</returns> 68 public static DataSet GetXml(string XmlPath) 69 { 70 DataSet ds = new DataSet(); 71 ds.ReadXml(@XmlPath); 72 return ds; 73 } 74 #endregion 75 76 #region 读取xml文档并返回一个节点 77 /// <summary> 78 /// 读取xml文档并返回一个节点:适用于一级节点 79 /// </summary> 80 /// <param name="XmlPath">xml路径</param> 81 /// <param name="NodeName">节点</param> 82 /// <returns></returns> 83 public static string ReadXmlReturnNode(string XmlPath, string Node) 84 { 85 XmlDocument docXml = new XmlDocument(); 86 docXml.Load(@XmlPath); 87 XmlNodeList xn = docXml.getElementsByTagName_r(Node); 88 return xn.Item(0).InnerText.ToString(); 89 } 90 #endregion 91 92 #region 查找数据,返回一个DataSet 93 /// <summary> 94 /// 查找数据,返回当前节点的所有下级节点,填充到一个DataSet中 95 /// </summary> 96 /// <param name="xmlPath">xml文档路径</param> 97 /// <param name="XmlPathNode">节点的路径:根节点/父节点/当前节点</param> 98 /// <returns></returns> 99 public static DataSet GetXmlData(string xmlPath, string XmlPathNode) 100 { 101 XmlDocument objXmlDoc = new XmlDocument(); 102 objXmlDoc.Load(xmlPath); 103 DataSet ds = new DataSet(); 104 StringReader read = new StringReader(objXmlDoc.SelectSingleNode(XmlPathNode).OuterXml); 105 ds.ReadXml(read); 106 return ds; 107 } 108 #region 读取指定节点的指定属性值 109 /// <summary> 110 /// 功能: 111 /// 读取指定节点的指定属性值 112 /// </summary> 113 /// <param name="strNode">节点路径</param> 114 /// <param name="strAttribute">此节点的属性</param> 115 /// <returns></returns> 116 public string GetXmlNodeAttribute(string xmlPath, string strNode, string strAttribute) 117 { 118 string strReturn = ""; 119 xmlDoc.Load(xmlPath); 120 try 121 { 122 //根据指定路径获取节点 123 XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode); 124 //获取节点的属性,并循环取出需要的属性值 125 XmlAttributeCollection xmlAttr = xmlNode.Attributes; 126 127 for (int i = 0; i < xmlAttr.Count; i++) 128 { 129 if (xmlAttr.Item(i).Name == strAttribute) 130 strReturn = xmlAttr.Item(i).Value; 131 } 132 } 133 catch (XmlException xmle) 134 { 135 throw xmle; 136 } 137 return strReturn; 138 } 139 #endregion 140 141 #region 读取指定节点的值 142 /// <summary> 143 /// 功能: 144 /// 读取指定节点的值 145 /// </summary> 146 /// <param name="strNode">节点名称(xpath)</param> 147 /// <returns></returns> 148 public string GetXmlNodeValue(string xmlPath,string strNode) 149 { 150 string strReturn = String.Empty; 151 xmlDoc.Load(xmlPath); 152 try 153 { 154 //根据路径获取节点 155 XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode); 156 strReturn = xmlNode.InnerText; 157 } 158 catch (XmlException xmle) 159 { 160 System.Console.WriteLine(xmle.Message); 161 } 162 return strReturn; 163 } 164 #endregion 165 166 167 168 #region 根据节点属性读取子节点值(较省资源模式) 169 /// <summary> 170 /// 根据节点属性读取子节点值(较省资源模式) 171 /// </summary> 172 /// <param name="XmlPath">xml路径</param> 173 /// <param name="FatherElement">父节点值</param> 174 /// <param name="AttributeName">属性名称</param> 175 /// <param name="AttributeValue">属性值</param> 176 /// <param name="ArrayLength">返回的数组长度</param> 177 /// <returns></returns> 178 public static System.Collections.ArrayList GetSubElementByAttribute(string XmlPath, string FatherElement, string AttributeName, string AttributeValue, int ArrayLength) 179 { 180 System.Collections.ArrayList al = new System.Collections.ArrayList(); 181 XmlDocument docXml = new XmlDocument(); 182 docXml.Load(@XmlPath); 183 XmlNodeList xn; 184 xn = docXml.DocumentElement.SelectNodes("//" + FatherElement + "[" + @AttributeName + "='" + AttributeValue + "']"); 185 XmlNodeList xx = xn.Item(0).ChildNodes; 186 for (int i = 0; i < ArrayLength & i < xx.Count; i++) 187 { 188 189 al.Add(xx.Item(i).InnerText); 190 } 191 return al; 192 193 } 194 #endregion