XML




五章    XML(extensible markup language)


1节
xml文件读取和写入----------------------------------------------------------------------(*)

xml:标记语言(文档中不想要打印输出的内容),存储数据,其标签几乎是没有什么定义的(只有一个文件头)
Html:也是标记语言,侧重展示数据,其标签几乎都是已经定义过了的(预定义)
xml语法特点:
1 严格区分大小写
2 有且只有一个根节点
3 有开始和结束标签
4 属性必须使用'"'
5 没有预定义标签,与html不一样
6 文档声明: <?xml verslon="1.0" encoding="utf-8"?>    //verslon="1.0" 版本
7 注释:<!-->
8 CDATA:即原意文本-<![CDATA[...]]>
9 注意编码问题,文本文件实际编码要与文档声明中编码一致

//.xml
<?xml version="1.0" encoding="utf-8"?>
<class>
    <student id="101">
        <name>yangguo</name>
        <gender>male</gender> //中文报错
    </student>
</class>

XML基础
优点:易读,格式化标准任何语言都内置了XML分析引擎,不用单独进行文件分析引擎的编写
XML就是用一种格式化的方式来存储数据,并且是文本文件,任何时候我们都能很容易的用记事本打开。与Excel,Word不一样
//例子:.net中内置的配置文件app.config web.config都是xml文件;Office2007的文件格式docx xlsx pptx都是xml,先改写成rar文件再解压
xml编写完成后可以用浏览器打开,如果写错了,浏览器会提示,如果明明没错,浏览器还是提示错误,则可能是文件编码问题

Linq To XML:读取写入
//xml文件读取
            string path = "";
            XDocument xdoc = XDocument.Load("xstu2.xml");  //从文件创建新的xml实例
            XElement root = xdoc.Root; //获取xml文档xml树的根元素
            IEnumerable<XElement> xeles = root.Elements();   //根据这个根创建子元素,并返回集合
            //遍历这个子元素集合
            foreach(XElement xele in xeles)
            {
                Console.WriteLine(xele.Name); //输出这个xml子元素的名称
            }
//xml写入
            XDocument xdoc = new XDocument();//创建xml文档
            XElement root = new XElement("school");//创建一个学校根节点
            XElement classXele = new XElement("class");//创建一个班级子节点
            classXele.SetAttributeValue("id", "1101");//设置这个班级子节点属性id的值
            XElement stuXele = new XElement("student");//再创建一个学生子节点
            stuXele.SetAttributeValue("id", "1027402020");//设置学生子节点的id的值
            XElement nameXele = new XElement("name");//创建一个姓名子节点
            nameXele.SetValue("yangguo");//设置姓名子节点的值
            //把姓名节点加入学生节点
            stuXele.Add(nameXele);
            //把学生节点加入班级节点
            classXele.Add(stuXele);
            //把班级节点加入根节点
            root.Add(classXele);
            //保存根节点到指定路径中
            root.Save("xshool.xml");
            Console.WriteLine("ok,xml写入成功");


//后面2个都是扩充

//将集合序列化为xml文档
            XmlDocument xd = new XmlDocument();
            string XmlPath = System.AppDomain.CurrentDomain.BaseDirectory + "lists1902.xml";
            using (StringWriter sw = new StringWriter())
            {
                XmlSerializer xz = new XmlSerializer(list.GetType());//new 一个类,可以将指定类型的对象序列化为xml文档(需要把这个类型标记为可序列化)
                xz.Serialize(sw, list);//将集合序列化为拼接字符串StringBuilder
                Console.WriteLine(sw.ToString());
                xd.LoadXml(sw.ToString());//把字符串加载到xml文档
                xd.Save(XmlPath);//保存xml文档到指定路劲中
                Console.WriteLine("写入文件成功!");
                Console.ReadKey();
            }

        }
    }
    [Serializable]
    public class UserEntity
    {
        public int UserId;
        public string Name;
        public string Mobile;
        public string IDCardNo;
        public string OrderNo;
        public override string ToString()
        {
            return String.Format("序号:{0} 姓名:{1} 手机号: {2} 身份证:{3} 订单号:{4} ", UserId, Name, Mobile, IDCardNo, OrderNo);
        }
    }


//将excel中文件导入xml
    using (Stream stream = new FileStream(@"C:UsersyangguoDesktop eexcel.xls", FileMode.Open, FileAccess.Read))
    {
        IWorkbook workbook = new HSSFWorkbook(stream);
        ISheet sheet = workbook.GetSheetAt(0);
        XmlDocument xd = new XmlDocument();
        XElement root = new XElement(sheet.SheetName);

        int k = 0;
        for (int i = 1; i <= sheet.LastRowNum; i++)
        {
            XElement UserEntityEle = new XElement("UserEntity");
            IRow row = sheet.GetRow(i);
            if(row.GetCell(4).NumericCellValue==1)//如果索引4的单元格值为1,就生成xml
            {
                XElement UserId = new XElement("UserId");

                UserId.SetValue(++k);
                XElement Name = new XElement("Name");
                Name.SetValue(row.GetCell(0).StringCellValue);
                XElement Mobile = new XElement("Mobile");
                Mobile.SetValue(row.GetCell(2).StringCellValue);
                XElement IDCardNo = new XElement("IDCardNo");
                IDCardNo.SetValue(row.GetCell(3).StringCellValue);
                UserEntityEle.Add(UserId);
                UserEntityEle.Add(Name);
                UserEntityEle.Add(Mobile);
                UserEntityEle.Add(IDCardNo);
                root.Add(UserEntityEle);
            }
      
        }
        root.Save("last1.xml");
        Console.WriteLine("ok");
    }
    Console.ReadKey();



2节


//待读取xml文件
//例子1
<?xml version="1.0" encoding="utf-8"?>        //编码最好用"UTF-8"格式,因为vs识别不了"utf8"---------------------------(*)
<CFX>
    <MSG>
        <交易码  val="1000"/>
        <流水号  val="100000000000001"/>
        <金额  val="1234567890.12"/>
        <付款机构  val="腾讯销售部"/>
        <付款单位账号  val="12345678901234567890"/>
        <收款机构  val="新浪财务部"/>
        <收款单位账号  val="12345678901234567890"/>
    </MSG>
    ...
</CFX>
//例子2
<?xml version="1.0" encoding="UTF-8"?>
<Users>
    <user id="001">
        <!--id的值,用户输入有可能有重复,这里不允许重复的,为了简单操作咋们就不判断了-->
        <name>admin</name>
        <password>admin123</password>
    </user>
    ...
</Users>
//在窗口加载时从XML文档中获得所有用户集合
            //获得xml文档的user节点集合
            XDocument xdoc = XDocument.Load("xdoc\xUsers.xml");
            //遍历每一个user节点
            foreach(XElement userXele in xdoc.Root.Elements())
            {
                //把user节点的子节点转换为一个用户对象
                User user = new User();
                user.Id = Convert.ToInt32(userXele.Attribute("id").Value);
                user.Name = userXele.Element("name").Value;
                user.Password = userXele.Element("password").Value;
                list.Add(user);
            }



3节
xml大项目读取

<?xml version="1.0" encoding="gb2312"?>
<class>
    <student id="001">
        <name>卡卡西</name>
        <gender>男</gender>
        <age>23</age>
    </student>
    ...
</class>
//设置列头 RowHeadersVisible=false
//设置选择模式 FullRowSelect
//创建一个学生类
//读取xml文件,获取最低节点的学生集合
//把集合绑定到dgvStudents
//取消默认第一行选中 if(dgv.Rows.Count>0){dgv.SelectedRows[0].Selected=false;}



4节
xml大项目写入

//GroupBox(新增)
//获取用户输入内容
//读取xml文件
//创建元素,加入xml根节点
//保存xml文件
//刷新

//删除:鼠标右键菜单ContextMenuStrip---添加右键菜单中的内容---dgv绑定到哪个右键菜单



5节
xml大项目删除

//如果选中,获得id
            if(dgvStudents.SelectedRows.Count<=0)
            {
                MessageBox.Show("请先选中要删除的行");
                return;
            }
            string id = lbId.Text;
            //读取xml文件,获得根节点
            XDocument xdoc = XDocument.Load("xstu\xclass.xml");
            XElement root = xdoc.Root;
            //根据id就是根结点下的stu节点的id属性的值,查询并返回根节点下的stu节点
            XElement stu = root.Elements("student").Where(x => x.Attribute("id").Value == id).Single();-----------------------------------------------------------(*)
            //移除这个stu节点
            stu.Remove();
            //保存到xml文件
            root.Save("xstu\xclass.xml");
            //刷新
            LoadStudentsByXmlFile();



6节
xml大项目修改

//当前是新开了一个GroupBox






原文地址:https://www.cnblogs.com/adolphyang/p/4739006.html