五章 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:\Users\yangguo\Desktop\reexcel.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