none
关于操作XML文件的问题 RRS feed

  • 问题

  • Hello,

    XML文件在ASP.NET中一般用什么控件显示?

    怎么使用GridView对xml文件进行增,删,改,查?

    Thanks!!!


    Never bend, never break, never back down!
    2010年7月1日 14:04

答案

  • 用dataset是可以加载xml文件的,但是你的xml格式一定要标准。gridview操作xml文件和修改数据库基本上是差不多的,

    只是你可能需要对xml操作进行了解的。如果你不使用dataset加载xml文件,也可以使用类来操作。我这里给你一个读取和设置的方法。

    如有不对的地方,还请大家指教,代码如下:

     /// <summary>
        /// 多指型读取XML文档(属性)
        /// </summary>
        /// <typeparam name="T">需要返回的类型</typeparam>
        /// <returns>同一类型的所有数据</returns>
        public object ReadObjectsByType<T>()
        {
          IList<T> returnData = new List<T>();
          if (File.Exists(_path))
          {
            Type ParmType = typeof(T);//获得该类的Type
            _xml.Load(_path);
            XmlElement element = _xml.DocumentElement;
    
            XmlNodeList nodes = element.SelectNodes(ParmType.Name);
            try
            {
              foreach (XmlNode node in nodes)
              {
                T currParm = Activator.CreateInstance<T>();
                foreach (XmlAttribute Attribute in node.Attributes)
                {
                  
                  PropertyInfo pi = ParmType.GetProperty(Attribute.Name);
                  try
                  {
                    if (Attribute.InnerText.StartsWith("System"))
                    {
                      if (Attribute.InnerText.StartsWith("System.Data"))
                      {
                        pi.SetValue(currParm, StringToType(pi.PropertyType, Attribute.InnerText, _path), null);
                      }
                      else
                      {
                        pi.SetValue(currParm, Type.GetType(Attribute.Value), null);
                      }
                    }
                    else
                    {
                      pi.SetValue(currParm, StringToType(pi.PropertyType, Attribute.InnerText, _path), null);
                    }
                  }
                  catch
                  {
                  }
                }
                returnData.Add(currParm);
              }
            }
            catch
            {
            }
          }
          return returnData;
        }
    
    /// <summary>
        /// 多值型设置XML文档(属性)
        /// </summary>
        /// <param name="Parm">对象</param>
        public bool WriteObjectByAttributes(object Parm, string AttributeName, string AttributeValue)
        {
          if (File.Exists(_path))
          {
            try
            {
              Type ParmType = Parm.GetType();//获得该类的Type
              _xml.Load(_path);
              XmlElement element = _xml.DocumentElement;
              XmlNodeList nodes = element.SelectNodes(ParmType.Name);
              XmlNode node=null;
              foreach (XmlNode no in nodes)
              {
                if (no.Attributes[AttributeName].Value == AttributeValue)
                {
                  node = no;
                  break;
                }
              }
              if (node == null)
              {
                node = _xml.CreateElement(ParmType.Name);
                element.AppendChild(node);
              }
              else
              {
                node.RemoveAll();
              }
              foreach (PropertyInfo pi in ParmType.GetProperties())
              {
                if (pi.Name != "TypeId")
                  (node as XmlElement).SetAttribute(pi.Name, pi.GetValue(Parm, null).ToString());
              }
              _xml.Save(_path);
              return true;
            }
            catch
            {
              return false;
            }
          }
          else
          {
            return false;
          }
        }
    
     /// <summary>
        /// 删除节点
        /// </summary>
        /// <param name="Parm">对象</param>
        public bool DelObjectByAttributes(object Parm, string AttributeName, string AttributeValue)
        {
          if (File.Exists(_path))
          {
            try
            {
              Type ParmType = Parm.GetType();//获得该类的Type
              _xml.Load(_path);
              XmlElement element = _xml.DocumentElement;
              XmlNodeList nodes = element.SelectNodes(ParmType.Name);
              XmlNode node = null;
              foreach (XmlNode no in nodes)
              {
                if (no.Attributes[AttributeName].Value == AttributeValue)
                {
                  node = no;
                  break;
                }
              }
              if (node!= null)
              {
                node.ParentNode.RemoveChild(node);
                _xml.Save(_path);
              }
              return true;
            }
            catch
            {
              return false;
            }
          }
          else
          {
            return false;
          }
        }

    • 已标记为答案 Sven K 2010年7月4日 10:43
    2010年7月1日 15:39

全部回复

  • 用dataset是可以加载xml文件的,但是你的xml格式一定要标准。gridview操作xml文件和修改数据库基本上是差不多的,

    只是你可能需要对xml操作进行了解的。如果你不使用dataset加载xml文件,也可以使用类来操作。我这里给你一个读取和设置的方法。

    如有不对的地方,还请大家指教,代码如下:

     /// <summary>
        /// 多指型读取XML文档(属性)
        /// </summary>
        /// <typeparam name="T">需要返回的类型</typeparam>
        /// <returns>同一类型的所有数据</returns>
        public object ReadObjectsByType<T>()
        {
          IList<T> returnData = new List<T>();
          if (File.Exists(_path))
          {
            Type ParmType = typeof(T);//获得该类的Type
            _xml.Load(_path);
            XmlElement element = _xml.DocumentElement;
    
            XmlNodeList nodes = element.SelectNodes(ParmType.Name);
            try
            {
              foreach (XmlNode node in nodes)
              {
                T currParm = Activator.CreateInstance<T>();
                foreach (XmlAttribute Attribute in node.Attributes)
                {
                  
                  PropertyInfo pi = ParmType.GetProperty(Attribute.Name);
                  try
                  {
                    if (Attribute.InnerText.StartsWith("System"))
                    {
                      if (Attribute.InnerText.StartsWith("System.Data"))
                      {
                        pi.SetValue(currParm, StringToType(pi.PropertyType, Attribute.InnerText, _path), null);
                      }
                      else
                      {
                        pi.SetValue(currParm, Type.GetType(Attribute.Value), null);
                      }
                    }
                    else
                    {
                      pi.SetValue(currParm, StringToType(pi.PropertyType, Attribute.InnerText, _path), null);
                    }
                  }
                  catch
                  {
                  }
                }
                returnData.Add(currParm);
              }
            }
            catch
            {
            }
          }
          return returnData;
        }
    
    /// <summary>
        /// 多值型设置XML文档(属性)
        /// </summary>
        /// <param name="Parm">对象</param>
        public bool WriteObjectByAttributes(object Parm, string AttributeName, string AttributeValue)
        {
          if (File.Exists(_path))
          {
            try
            {
              Type ParmType = Parm.GetType();//获得该类的Type
              _xml.Load(_path);
              XmlElement element = _xml.DocumentElement;
              XmlNodeList nodes = element.SelectNodes(ParmType.Name);
              XmlNode node=null;
              foreach (XmlNode no in nodes)
              {
                if (no.Attributes[AttributeName].Value == AttributeValue)
                {
                  node = no;
                  break;
                }
              }
              if (node == null)
              {
                node = _xml.CreateElement(ParmType.Name);
                element.AppendChild(node);
              }
              else
              {
                node.RemoveAll();
              }
              foreach (PropertyInfo pi in ParmType.GetProperties())
              {
                if (pi.Name != "TypeId")
                  (node as XmlElement).SetAttribute(pi.Name, pi.GetValue(Parm, null).ToString());
              }
              _xml.Save(_path);
              return true;
            }
            catch
            {
              return false;
            }
          }
          else
          {
            return false;
          }
        }
    
     /// <summary>
        /// 删除节点
        /// </summary>
        /// <param name="Parm">对象</param>
        public bool DelObjectByAttributes(object Parm, string AttributeName, string AttributeValue)
        {
          if (File.Exists(_path))
          {
            try
            {
              Type ParmType = Parm.GetType();//获得该类的Type
              _xml.Load(_path);
              XmlElement element = _xml.DocumentElement;
              XmlNodeList nodes = element.SelectNodes(ParmType.Name);
              XmlNode node = null;
              foreach (XmlNode no in nodes)
              {
                if (no.Attributes[AttributeName].Value == AttributeValue)
                {
                  node = no;
                  break;
                }
              }
              if (node!= null)
              {
                node.ParentNode.RemoveChild(node);
                _xml.Save(_path);
              }
              return true;
            }
            catch
            {
              return false;
            }
          }
          else
          {
            return false;
          }
        }

    • 已标记为答案 Sven K 2010年7月4日 10:43
    2010年7月1日 15:39
  • 如果你的XML的结构是数据库1---*数据表1---*数据行,那么可以使用DataSet来读取。

    否则只能自己编码实现。


    Eternal Snow
    2010年7月2日 2:02