c#操作xml之三

上次,我们介绍了增加和删除xml的一些操作,这次我们将介绍如何更改和读取xml特定节点。我们依然以上次的xml文件为例:

<? xml version="1.0" encoding="utf-8" ?>
< phonebook >
  
< member  id ="6" >
    
< name > 456 </ name >
    
< qq > 5465 </ qq >
  
</ member >
  
< member  id ="5" >
    
< name > jjjjj </ name >
    
< qq > 3456789 </ qq >
  
</ member >
</ phonebook >

 
首先是更改操作,它也包含两个方面即更改指定节点的值和指定节点的某一属性值,我们可以使用的方法如下:
 

   /**/ /// <summary>
        
/// 更新Xml节点内容
        
/// </summary>
        
/// <param name="xmlPath">xml路径</param>
        
/// <param name="Node">要更换内容的节点:节点路径 根节点/父节点/当前节点</param>
        
/// <param name="Content">新的内容</param>

         public   static   void  XmlNodeReplace( string  xmlPath,  string  Node,  string  Content)
        
{
            XmlDocument objXmlDoc 
= new XmlDocument();
            objXmlDoc.Load(xmlPath);
            objXmlDoc.SelectSingleNode(Node).InnerText 
= Content;
            objXmlDoc.Save(xmlPath);

        }


 
/**/ /// <summary>
        
/// 更改节点的属性值
        
/// </summary>
        
/// <param name="xmlPath">文件路径</param>
        
/// <param name="NodePath">节点路径</param>
        
/// <param name="NodeAttribute1">要更改的节点属性的名称</param>
        
/// <param name="NodeAttributeText">更改的属性值</param>

         public   static   void  XmlAttributeEide( string  xmlPath,  string  NodePath,  string  NodeAttribute1,  string  NodeAttributeText)
        
{
            XmlDocument objXmlDoc 
= new XmlDocument();
            objXmlDoc.Load(xmlPath);
            XmlNode nodePath 
= objXmlDoc.SelectSingleNode(NodePath);
            XmlElement xe 
= (XmlElement)nodePath;
            xe.SetAttribute(NodeAttribute1, NodeAttributeText);
            objXmlDoc.Save(xmlPath);

        }


第一个方面,加入我们要更改menber(id=6)下节点name的值我们可以这样做:
 

     string  xmlPath  =  Server.MapPath( " ~/test.xml " );

        XmlHelper.XmlNodeReplace(xmlPath, 
" //member[@id=6]/name "  , " hya " );

也可以
 

     string  xmlPath  =  Server.MapPath( " ~/test.xml " );

        XmlHelper.XmlNodeReplace(xmlPath, 
" //member[qq='5465']/name "  , " hya " );

总之你能够用xpath语法找到所要更改的节点即可。
更改属性值也一样,在这不在赘述!
查询正如对数据库操作查询考查你对sql的熟练程度一样,对xml的查询也就是考查你对xpath了解多少。在这里我只是列出几个有限的调用方法,相信从上面的介绍中你可以大致对xpath有了一定的了解:
 


        
读取XML到DataSet #region 读取XML到DataSet
        
/**//// <summary>
        
/// 功能:读取XML到DataSet中
        
/// </summary>
        
/// <param name="XmlPath">xml路径</param>
        
/// <returns>DataSet</returns>

        public static DataSet GetXml(string XmlPath)
        
{
            DataSet ds 
= new DataSet();
            ds.ReadXml(@XmlPath);
            
return ds;
        }

        
#endregion


        
读取xml文档并返回一个节点 #region 读取xml文档并返回一个节点
        
/**//// <summary>
        
/// 读取xml文档并返回一个节点:适用于一级节点
        
/// </summary>
        
/// <param name="XmlPath">xml路径</param>
        
/// <param name="NodeName">节点</param>
        
/// <returns></returns>

        public static string ReadXmlReturnNode(string XmlPath, string Node)
        
{
            XmlDocument docXml 
= new XmlDocument();
            docXml.Load(@XmlPath);
            XmlNodeList xn 
= docXml.GetElementsByTagName(Node);
            
return xn.Item(0).InnerText.ToString();
        }

        
#endregion


        
查找数据,返回一个DataSet #region 查找数据,返回一个DataSet
        
/**//// <summary>
        
/// 查找数据,返回当前节点的所有下级节点,填充到一个DataSet中
        
/// </summary>
        
/// <param name="xmlPath">xml文档路径</param>
        
/// <param name="XmlPathNode">节点的路径:根节点/父节点/当前节点</param>
        
/// <returns></returns>

        public static DataSet GetXmlData(string xmlPath, string XmlPathNode)
        
{
            XmlDocument objXmlDoc 
= new XmlDocument();
            objXmlDoc.Load(xmlPath);
            DataSet ds 
= new DataSet();
            StringReader read 
= new StringReader(objXmlDoc.SelectSingleNode(XmlPathNode).OuterXml);
            ds.ReadXml(read);
            
return ds;
        }

  
读取指定节点的指定属性值#region 读取指定节点的指定属性值
        
/**//// <summary>
        
/// 功能:
        
/// 读取指定节点的指定属性值
        
/// </summary>
        
/// <param name="strNode">节点路径</param>
        
/// <param name="strAttribute">此节点的属性</param>
        
/// <returns></returns>

        public string GetXmlNodeAttribute(string xmlPath, string strNode, string strAttribute)
        
{
            
string strReturn = "";
            xmlDoc.Load(xmlPath);
            
try
            
{
                
//根据指定路径获取节点
                XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
                
//获取节点的属性,并循环取出需要的属性值
                XmlAttributeCollection xmlAttr = xmlNode.Attributes;

                
for (int i = 0; i < xmlAttr.Count; i++)
                
{
                    
if (xmlAttr.Item(i).Name == strAttribute)
                        strReturn 
= xmlAttr.Item(i).Value;
                }

            }

            
catch (XmlException xmle)
            
{
                
throw xmle;
            }

            
return strReturn;
        }

        
#endregion


        
读取指定节点的值#region 读取指定节点的值
        
/**//// <summary>
        
/// 功能:
        
/// 读取指定节点的值
        
/// </summary>
        
/// <param name="strNode">节点名称(xpath)</param>
        
/// <returns></returns>

        public string GetXmlNodeValue(string xmlPath,string strNode)
        
{
            
string strReturn = String.Empty;
            xmlDoc.Load(xmlPath);
            
try
            
{
                
//根据路径获取节点
                XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
                strReturn 
= xmlNode.InnerText;
            }

            
catch (XmlException xmle)
            
{
                System.Console.WriteLine(xmle.Message);
            }

            
return strReturn;
        }

        
#endregion




        
根据节点属性读取子节点值(较省资源模式)#region 根据节点属性读取子节点值(较省资源模式)
        
/**//// <summary>
        
/// 根据节点属性读取子节点值(较省资源模式)
        
/// </summary>
        
/// <param name="XmlPath">xml路径</param>
        
/// <param name="FatherElement">父节点值</param>
        
/// <param name="AttributeName">属性名称</param>
        
/// <param name="AttributeValue">属性值</param>
        
/// <param name="ArrayLength">返回的数组长度</param>
        
/// <returns></returns>

        public static System.Collections.ArrayList GetSubElementByAttribute(string XmlPath, string FatherElement, string AttributeName, string AttributeValue, int ArrayLength)
        
{
            System.Collections.ArrayList al 
= new System.Collections.ArrayList();
            XmlDocument docXml 
= new XmlDocument();
            docXml.Load(@XmlPath);
            XmlNodeList xn;
            xn 
= docXml.DocumentElement.SelectNodes("//" + FatherElement + "[" + @AttributeName + "='" + AttributeValue + "']");
            XmlNodeList xx 
= xn.Item(0).ChildNodes;
            
for (int i = 0; i < ArrayLength & i < xx.Count; i++)
            
{

                al.Add(xx.Item(i).InnerText);
            }

            
return al;

        }

        
#endregion

#region 读取指定节点的指定属性值
        
/**//// <summary>
        
/// 功能:
        
/// 读取指定节点的指定属性值
        
/// </summary>
        
/// <param name="strNode">节点路径</param>
        
/// <param name="strAttribute">此节点的属性</param>
        
/// <returns></returns>

        public string GetXmlNodeAttribute(string xmlPath, string strNode, string strAttribute)
        
{
            
string strReturn = "";
            xmlDoc.Load(xmlPath);
            
try
            
{
                
//根据指定路径获取节点
                XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
                
//获取节点的属性,并循环取出需要的属性值
                XmlAttributeCollection xmlAttr = xmlNode.Attributes;

                
for (int i = 0; i < xmlAttr.Count; i++)
                
{
                    
if (xmlAttr.Item(i).Name == strAttribute)
                        strReturn 
= xmlAttr.Item(i).Value;
                }

            }

            
catch (XmlException xmle)
            
{
                
throw xmle;
            }

            
return strReturn;
        }

        
#endregion


        
读取指定节点的值#region 读取指定节点的值
        
/**//// <summary>
        
/// 功能:
        
/// 读取指定节点的值
        
/// </summary>
        
/// <param name="strNode">节点名称(xpath)</param>
        
/// <returns></returns>

        public string GetXmlNodeValue(string xmlPath,string strNode)
        
{
            
string strReturn = String.Empty;
            xmlDoc.Load(xmlPath);
            
try
            
{
                
//根据路径获取节点
                XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
                strReturn 
= xmlNode.InnerText;
            }

            
catch (XmlException xmle)
            
{
                System.Console.WriteLine(xmle.Message);
            }

            
return strReturn;
        }

        
#endregion




        
根据节点属性读取子节点值(较省资源模式)#region 根据节点属性读取子节点值(较省资源模式)
        
/**//// <summary>
        
/// 根据节点属性读取子节点值(较省资源模式)
        
/// </summary>
        
/// <param name="XmlPath">xml路径</param>
        
/// <param name="FatherElement">父节点值</param>
        
/// <param name="AttributeName">属性名称</param>
        
/// <param name="AttributeValue">属性值</param>
        
/// <param name="ArrayLength">返回的数组长度</param>
        
/// <returns></returns>

        public static System.Collections.ArrayList GetSubElementByAttribute(string XmlPath, string FatherElement, string AttributeName, string AttributeValue, int ArrayLength)
        
{
            System.Collections.ArrayList al 
= new System.Collections.ArrayList();
            XmlDocument docXml 
= new XmlDocument();
            docXml.Load(@XmlPath);
            XmlNodeList xn;
            xn 
= docXml.DocumentElement.SelectNodes("//" + FatherElement + "[" + @AttributeName + "='" + AttributeValue + "']");
            XmlNodeList xx 
= xn.Item(0).ChildNodes;
            
for (int i = 0; i < ArrayLength & i < xx.Count; i++)
            
{

                al.Add(xx.Item(i).InnerText);
            }

            
return al;

        }

        
#endregion


 

分类: XML

你可能感兴趣的:(xml,C#,职场,操作,休闲)