首页 > 其他 > 详细

XML操作

时间:2014-02-10 18:30:53      阅读:395      评论:0      收藏:0      [点我收藏+]

1.简单读写:

引入using System.Xml;命名空间

写操作

bubuko.com,布布扣
//创建XmlDocument对象
 XmlDocument doc = new XmlDocument();

//载入(.load方法载入具体文件)
 doc.LoadXml("<Student type=‘regular‘ Section=‘B‘><Name>xlh</Name></Student>");
//常用属性方法有SelectSingleNode,ChildNodes,GetAttribute,AppendChild等,处理逻辑为遍历查找,例如: XmlNodeList nodeList = xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点,对于指定名称节点可以通过  XmlNodeList lis = doc.GetElementsByTagName("Name") ,然后取值 String str = lis[0].InnerText 获得。
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; } }
bubuko.com,布布扣

也可以通过XmlWriter来进行写入

读操作

通过XmlReader读取器例如

bubuko.com,布布扣
 using (XmlReader read = XmlReader.Create(xmUrl))
            {
                while (read.Read())
                {
                    switch (read.NodeType)
                    {
                        case XmlNodeType.Element:
                            break;
                        case XmlNodeType.Text:
                            xs += read.Value + "|";
                            break;
                    }
                }
            }
bubuko.com,布布扣

将文本内容取出,或者 XmlNodeList lis = doc.GetElementsByTagName("Name") 遍历指定属性来获取。以上方法只适合简单少量的读取,对于规则性数据还要采用序列化的方式。

创建操作参见http://www.cnblogs.com/yukaizhao/archive/2011/07/19/csharp_xmldocument_access_xml.html

2.序列化使用:

系列化将数据封装在数据实体中,所以使用时先定义实体类

bubuko.com,布布扣
[XmlRoot("Root")]
public class People
    {
        [XmlAttribute("NAME")]
        public string Name
        { set; get; }
        [XmlAttribute("AGE")]
        public int Age
        { set; get; }
    }
    [XmlRoot("Root")]
    public class Student : People
    {
        [XmlElement("CLASS")]
        public string Class
        { set; get; }
        [XmlElement("NUMBER")]
        public int Number
        { set; get; }
    }
bubuko.com,布布扣

定义特性直接表示了xml文档结构关系。处理单元中要处理的数据

bubuko.com,布布扣
   Student stu = new Student()
            {
                Age = 10,
                Class = "Class One",
                Name = "Tom",
                Number = 1
            };
bubuko.com,布布扣

序列化

       XmlSerializer ser = new XmlSerializer(typeof(Student));
            ser.Serialize(File.Create("C:\\x.xml"), stu);

反序列化

XmlSerializer ser = new XmlSerializer(typeof(Student));
            Student stu = ser.Deserialize(File.OpenRead("C:\\x.xml")) as Stud

关于序列化操作找到一个封装好的操作类

bubuko.com,布布扣
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;
using System.Xml;

// 此处代码来源于博客【在.net中读写config文件的各种方法】的示例代码
// http://www.cnblogs.com/fish-li/archive/2011/12/18/2292037.html

namespace MyMVC
{
    public static class XmlHelper
    {
        /// <summary>
        /// 序列化操作以及流中换行处理
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="o"></param>
        /// <param name="encoding"></param>
        private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding)
        {
            if (o == null)
                throw new ArgumentNullException("o");
            if (encoding == null)
                throw new ArgumentNullException("encoding");

            XmlSerializer serializer = new XmlSerializer(o.GetType());

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.NewLineChars = "\r\n";
            settings.Encoding = encoding;
            settings.IndentChars = "    ";
            //按照相关设置快速序列化对象
            using (XmlWriter writer = XmlWriter.Create(stream, settings))
            {
                serializer.Serialize(writer, o);
                writer.Close();
            }
        }

        /// <summary>
        /// 将一个对象序列化为XML字符串
        /// </summary>
        /// <param name="o">要序列化的对象</param>
        /// <param name="encoding">编码方式</param>
        /// <returns>序列化产生的XML字符串</returns>
        public static string XmlSerialize(object o, Encoding encoding)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                XmlSerializeInternal(stream, o, encoding);

                stream.Position = 0;
                using (StreamReader reader = new StreamReader(stream, encoding))
                {
                    return reader.ReadToEnd();
                }
            }
        }

        /// <summary>
        /// 将一个对象按XML序列化的方式写入到一个文件
        /// </summary>
        /// <param name="o">要序列化的对象</param>
        /// <param name="path">保存文件路径</param>
        /// <param name="encoding">编码方式</param>
        public static void XmlSerializeToFile(object o, string path, Encoding encoding)
        {
            if (string.IsNullOrEmpty(path))
                throw new ArgumentNullException("path");

            using (FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                XmlSerializeInternal(file, o, encoding);
            }
        }

        /// <summary>
        /// 从XML字符串中反序列化对象
        /// </summary>
        /// <typeparam name="T">结果对象类型</typeparam>
        /// <param name="s">包含对象的XML字符串</param>
        /// <param name="encoding">编码方式</param>
        /// <returns>反序列化得到的对象</returns>
        public static T XmlDeserialize<T>(string s, Encoding encoding)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentNullException("s");
            if (encoding == null)
                throw new ArgumentNullException("encoding");

            XmlSerializer mySerializer = new XmlSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s)))
            {
                using (StreamReader sr = new StreamReader(ms, encoding))
                {
                    return (T)mySerializer.Deserialize(sr);
                }
            }
        }

        /// <summary>
        /// 读入一个文件,并按XML的方式反序列化对象。
        /// </summary>
        /// <typeparam name="T">结果对象类型</typeparam>
        /// <param name="path">文件路径</param>
        /// <param name="encoding">编码方式</param>
        /// <returns>反序列化得到的对象</returns>
        public static T XmlDeserializeFromFile<T>(string path, Encoding encoding)
        {
            if (string.IsNullOrEmpty(path))
                throw new ArgumentNullException("path");
            if (encoding == null)
                throw new ArgumentNullException("encoding");

            string xml = File.ReadAllText(path, encoding);
            return XmlDeserialize<T>(xml, encoding);
        }
    }
}
View Code

补充:关于序列化不光xml序列化,json数据也需要序列化

.net3.5以上可以通过DataContractJsonSerializer类和JavaScriptSerializer类序列化操作 (DataContractJsonSerializer在.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加对其的引用;.NET Framework 4在System.Runtime.Serialization中)

例如

//序列化
string
r1 = jsonSerializer.Serialize(personnel); //反序列化 Personnel _Personnel = jsonSerializer.Deserialize<Personnel>(r1);

.net2.0可以使用第三方的Newtonsoft.Json.dll进行序列化,例如:

bubuko.com,布布扣
 JsonSerializer jsser = new JsonSerializer();
//wInfo为事先定义好的实体类
 wInfo = JsonConvert.DeserializeObject<IpInfo>(jsonData);
bubuko.com,布布扣

XML操作

原文:http://www.cnblogs.com/wanglao/p/3543193.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!