XML:可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是存储数据。事实上XML与其他数据表现形式最大的不同是:他极其简单。这是一个看上去有点琐细的优点,但正是这点使XML与众不同。
XML与HTML的设计区别是:XML的核心是数据,其重点是数据的内容。而HTML 被设计用来显示数据,其重点是数据的显示。
XML和HTML语法区别:HTML的标记不是所有的都需要成对出现,XML则要求所有的标记必须成对出现;HTML标记不区分大小写,XML则 大小敏感,即区分大小写。
处理XML的组件类有:
写入XML:XmlDocument,XDocument,XmlTextWrter,XElement
读取XML:XmlDocument,XDocument,XPatNavigtor,XmlTxtReader
其中XmlTextWrter、XmlTxtReader是基于流的处理方式,它提供了较小的负载,但灵活性很低,只能以线性的方式处理XML。其它几种则是基于内存文档的处理方式,即把XML整个先读入内存,形成可预先识别的格式,再像操作对象一样操作这些XML中的元素。
XDocument提供了最为方便和直观的创建XML的功能,XDocument需要.NET Framework3.5支持。
XmlDocument通过XmlDocument.SelectNodes(XPATH表达式)筛选节点最为方便。
这里介绍后者,也就是在内存中操作XML的组件XmlDocument
XmlDocument把XML读入内存后保存为树的结点(node),结点被看作是XML文件的基本组成部分,结点可以是一个元素、特性、注释或者元素及特性的一个值。每个单独的XmlNode对象代表一个结点,XmlDocument将处于同一层次的XmlNode对象放在XmlNodeList集合中。
private void btnCreatXML_Click(object sender, EventArgs e)
{
//在程序所在目录中创建XML
//--这里用XML类的专业方法创建XML文件--
//1、XML文档声明
myxdoc.AppendChild(myxdoc.CreateXmlDeclaration("1.0", "UTF-8", ""));
//2、增加节点
//根节点xmleR(空文档的第一个节点即为根节点) 不带InnerText内容文本
XmlElement xmleR = myxdoc.CreateElement("", "book", "");
myxdoc.AppendChild(xmleR);
//增加R下子节点xmleSub1 带InnerText内容文本
XmlElement xmleSub1 = myxdoc.CreateElement("txt1");
xmleSub1.InnerText = "mytext";
xmleR.AppendChild(xmleSub1);
//增加R下子节点xmleSub2 带InnerText内容文本
XmlElement xmleSub2 = myxdoc.CreateElement("txt2");
XmlText txt = myxdoc.CreateTextNode("textnode2");
xmleSub2.AppendChild(txt);//InnerText文本当成xmleSub2下的节点
//使用XPATH表达式方式添加节点xmleSub2
myxdoc.SelectNodes("/book")[0].AppendChild(xmleSub2);
//增加R下带属性的子节点xmleA1 不带InnerText内容文本
XmlElement xmleA1 = myxdoc.CreateElement("server");
xmleA1.SetAttribute("ip", "172.30.218.10");
xmleA1.SetAttribute("status", "runing");
xmleA1.SetAttribute("level", "high");
xmleR.AppendChild(xmleA1);
//增加R下xmleA1下带属性的节点xmleA1S1 不带InnerText内容文本
XmlElement xmleA1S1 = myxdoc.CreateElement("interface");
xmleA1S1.SetAttribute("type", "etherent");
xmleA1S1.SetAttribute("speed", "1000M");
xmleA1.SelectNodes("/book/server")[0].AppendChild(xmleA1S1);
//增加R下xmleA1下带属性的节点xmleA1S2 带InnerText内容文本
XmlElement xmleA1S2 = myxdoc.CreateElement("interface");
xmleA1S2.SetAttribute("type", "AUX");
xmleA1S2.SetAttribute("speed", "9600K");
myxdoc.SelectNodes("/book/server")[0].AppendChild(xmleA1S2);
xmleA1S2.InnerText = "这个口子不能用";
//3、保存XML到文件
myxdoc.Save(dir + "\\text.xml");
//创建一个符合TABLE导入标准的XML
XmlDocument tabxml = new XmlDocument();
tabxml.AppendChild(tabxml.CreateXmlDeclaration("1.0", null,"yes"));
XmlElement xmlroot = tabxml.CreateElement("DocumentElement");
tabxml.AppendChild(xmlroot);
//第一行
XmlElement xmltabname1 = tabxml.CreateElement("tablename");
xmlroot.AppendChild(xmltabname1);
XmlElement xmlrows1c1 = tabxml.CreateElement("ID号");
xmlrows1c1.InnerText = "1001";
XmlElement xmlrows1c2 = tabxml.CreateElement("姓名");
xmlrows1c2.InnerText = "李一";
XmlElement xmlrows1c3 = tabxml.CreateElement("年龄");
xmlrows1c3.InnerText = "31";
xmltabname1.AppendChild(xmlrows1c1);
xmltabname1.AppendChild(xmlrows1c2);
xmltabname1.AppendChild(xmlrows1c3);
//第二行
XmlElement xmltabname2 = tabxml.CreateElement("tablename");
xmlroot.AppendChild(xmltabname2);
XmlElement xmlrows2c1 = tabxml.CreateElement("ID号");
xmlrows2c1.InnerText = "1002";
XmlElement xmlrows2c2 = tabxml.CreateElement("姓名");
xmlrows2c2.InnerText = "王二";
XmlElement xmlrows2c3 = tabxml.CreateElement("年龄");
xmlrows2c3.InnerText = "32";
xmltabname2.AppendChild(xmlrows2c1);
xmltabname2.AppendChild(xmlrows2c2);
xmltabname2.AppendChild(xmlrows2c3);
//第三行
XmlElement xmltabname3 = tabxml.CreateElement("tablename");
xmlroot.AppendChild(xmltabname3);
XmlElement xmlrows3c1 = tabxml.CreateElement("ID号");
xmlrows3c1.InnerText = "1003";
XmlElement xmlrows3c2 = tabxml.CreateElement("姓名");
xmlrows3c2.InnerText = "赵三";
XmlElement xmlrows3c3 = tabxml.CreateElement("年龄");
xmlrows3c3.InnerText = "33";
xmltabname3.AppendChild(xmlrows3c1);
xmltabname3.AppendChild(xmlrows3c2);
xmltabname3.AppendChild(xmlrows3c3);
//保存
tabxml.Save(dir + \\output.xml);
}
text.xml结果如下:
<?xml version="1.0" encoding="UTF-8" ?>
- <book>
<txt1>mytext</txt1>
<txt2>textnode2</txt2>
- <server ip="172.30.218.10" status="runing" level="high">
<interface type="etherent" speed="1000M" />
<interface type="AUX" speed="9600K">这个口子不能用</interface>
</server>
</book>
output.xml结果如下:
<?xml version="1.0" standalone="yes" ?>
- <DocumentElement>
- <tablename>
<ID号>1001</ID号>
<姓名>李一</姓名>
<年龄>31</年龄>
</tablename>
- <tablename>
<ID号>1002</ID号>
<姓名>王二</姓名>
<年龄>32</年龄>
</tablename>
- <tablename>
<ID号>1003</ID号>
<姓名>赵三</姓名>
<年龄>33</年龄>
</tablename>
</DocumentElement>
XML到DATATABLE的转换方法,以及使用XPATH读取节点,和读取节点的属性值
//XML文件到datatable转换方法一:
//直接读取到datatable时,datatable必须先有结构
dt.Columns.Add("ID号");
dt.Columns.Add("姓名");
dt.Columns.Add("年龄");
dt.TableName = "tablename";
dt.ReadXml(dir + "\\output.xml");
dataGridView1.DataSource = dt;
//XML文件到datatable转换方法二:
//也可以在导出datatable为XML时 先导出datatable的结构,然后在需要导入XML的时候先导入这个结构
dt.WriteXmlSchema(dir + "\\XmlSchema.xml"); //导出结构
dt.WriteXml(dir + "\\output.xml");
dt.ReadXmlSchema(dir + "\\output.xml"); //导入结构
dt.ReadXml(dir + "\\output.xml");
XmlDocument xdoc = new XmlDocument();
xdoc.Load(dir + "\\text.xml");
//获取属性值的方法:
//获取"/book/server/interfac"节点中 属性type="AUX"的节点 下的属性为"speed"的值"9600K"
//XML是区分大小写的 "/book/server/interface[@type='AUX']" 被叫作XPATH表达式
lblServer.Text = xdoc.SelectNodes("/book/server/interface[@type='AUX']")[0].Attributes["speed"].Value;
System.Xml.Linq 下提供了更为简单的 XElement 类 来操作XML 必须.NET3.5 以上
// XElement xPersons = new XElement("Persons");
// XElement xPerson1 = new XElement("Person");
// XElement xPerson2 = new XElement("Person");
// xPerson1.Value = "tom";//设置innertext
// xPerson1.SetAttributeValue("age", 30);//设置节点属性
// xPersons.SetAttributeValue("count",5);
// xPersons.Add(xPerson1);
// xPersons.Add(xPerson2);
// string xml = xPersons.ToString();