1.XML的特点
与html相似,XML是一种显示数据的标记语言,它可以使数据通过网络无障碍地进行传输。同样它也可以显示在用户的浏览器上,在日常的编程中可以发现XML用的也是特别多,比如我们解决方案的配置文件等。XML的主要功能是存储数据,有效的将数据和显示分离,它的重点是有序和合理地存储数据。XML可以自定义标签,还可以是中文,可以按自己的意愿充分表达文件的内容。可以看出XML最大的优势在于对数据的管理,再加上异构系统间的信息互通和更加精确的搜索,这就是我要掌握XML的原因。下面是一段XML代码:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <网络一班> <学生 group="man"> <学号>20135808</学号> <姓名>方一</姓名> <Age>20</Age> </学生> <学生 group="woman"> <学号>20135807</学号> <姓名>李一</姓名> <Age>21</Age> </学生> </网络一班>
其中第一行最后一个属性standalone为yes表示该文件未引用其他外部XML文件。我们要注意所有的XML元素必须合理包含,所有的XML文档必须有一个根元素,XML区分大小写。在System.Xml中包含了与XML文档读写操作相关的类,主要是XmlReader、XmlTextReader、XmlValidatingReader、XmlWriter等类。
2.简单操作Xml
显然C#肯定是用一个类来代表一个Xml,这个类是XmlDocument,它与XmlReader和XmlWriter一样具有读写功能,而且它还可以随机访问DOM树。下面是我写的一个操作Xml的例子:
public void CreateXml() { //创建一个空Xml文档 XmlDocument xmlDocument = new XmlDocument(); //XmlNode就是每一个节点,比如上面例子中的 "网络一班",这里创建的节点是一个Xml的声明 XmlNode xmlNode = xmlDocument.CreateNode(XmlNodeType.XmlDeclaration, "", ""); xmlDocument.AppendChild(xmlNode); //添加注释 XmlComment xmlComment = xmlDocument.CreateComment("Xml文件的注释内容"); xmlDocument.AppendChild(xmlComment); //为Xml文档加入元素,并在元素中添加文本 XmlElement xmlElement = xmlDocument.CreateElement("", "学生", ""); //增加一个属性 XmlAttribute attribute = xmlDocument.CreateAttribute("专业"); attribute.Value = "计算机"; xmlElement.Attributes.Append(attribute); xmlDocument.AppendChild(xmlElement); //增加一个子元素 XmlElement element2 = xmlDocument.CreateElement("姓名"); XmlText text2 = xmlDocument.CreateTextNode("王五"); element2.AppendChild(text2); xmlElement.AppendChild(element2); XmlElement element3 = xmlDocument.CreateElement("性别"); text2=xmlDocument.CreateTextNode("男"); element3.AppendChild(text2); xmlElement.AppendChild(element3); xmlDocument.Save(@"C:\Users\fyz\Desktop\MyXml.xml"); }
<?xml version="1.0"?> <!--Xml文件的注释内容--> <学生 专业="计算机"> <姓名>王五</姓名> <性别>男</性别> </学生>
这样就用代码创建了一个Xml文档,从中可以总结出使用的类的作用:
XmlDocument:表示Xml文档类
XmlNode:表示Xml文档中的单个节点
XmlText:表示元素或者属性的文本内容
XmlComment:表示Xml的注释内容
XmlElement:构成Xml文档的最小单位,表示单个数据比如<姓名>王五</姓名>
XmlAttribute:属性则是节点里的说明,如专业=“计算机”
XmlDeclaration:Xml文档第一行必须要有声明
3.读写Xml
当创建出Xml后,前面也提到有许多读写类去操作Xml。首先来看看XmlWriter类,它包含了写Xml的所有方法和属性,下面是写Xml的代码:
public void WriteXml() { XmlTextWriter xmlWriter = new XmlTextWriter(@"C:\Users\fyz\Desktop\MyXml2.xml",null); //对元素内容进行缩进 xmlWriter.Formatting = Formatting.Indented; //写入<?xml version="1.0"?> xmlWriter.WriteStartDocument(); //设置在名称和文本之间带有空格的处理指令, string str = "type=‘type/xsl‘ href=‘book.xsl‘"; xmlWriter.WriteProcessingInstruction("xml-stylesheet", str); //增加指定名称和可选属性的DocType声明 xmlWriter.WriteDocType("学生", null, null, "<!ENTITY sex ‘男‘>"); xmlWriter.WriteComment("Xml注释"); //写入元素 xmlWriter.WriteStartElement("学生"); xmlWriter.WriteAttributeString("专业", "计算机"); xmlWriter.WriteAttributeString("爱好", "编程"); xmlWriter.WriteElementString("姓名", "王五"); xmlWriter.WriteStartElement("性别"); //创建对上面实体的引用,显示时为 男 xmlWriter.WriteEntityRef("sex"); xmlWriter.WriteEndElement(); //写入CData信息 xmlWriter.WriteElementString("年龄", "21"); xmlWriter.WriteCData("年龄大了"); //关闭写入 xmlWriter.WriteEndElement(); xmlWriter.WriteEndDocument(); //将缓存中的所有内容刷新到基础流,并同时刷新基础流,也就是操作将写入到Xml xmlWriter.Flush(); xmlWriter.Close(); }
<?xml version="1.0"?> <?xml-stylesheet type=‘type/xsl‘ href=‘book.xsl‘?> <!DOCTYPE 学生[<!ENTITY sex ‘男‘>]> <!--Xml注释--> <学生 专业="计算机" 爱好="编程"> <姓名>王五</姓名> <性别>&sex;</性别> <年龄>21</年龄><![CDATA[年龄大了]]> </学生>
下面是使用XmlNodeReader类和XmlTextReader类来读取Xml文档的代码。
public void ReadXml() { XmlDocument document = new XmlDocument(); document.Load(@"C:\Users\fyz\Desktop\MyXml.xml"); XmlNodeReader nodeReader = new XmlNodeReader(document); //每次读取一个节点 while (nodeReader.Read()) { Console.WriteLine(nodeReader.NodeType+" "+nodeReader.Value); } Console.WriteLine("\r\n"); //使用XmlTextReader XmlTextReader textReader = new XmlTextReader(@"C:\Users\fyz\Desktop\MyXml2.xml"); while (textReader.Read()) { Console.WriteLine(textReader.NodeType); textReader.MoveToElement(); Console.WriteLine("Name"+textReader.Name); Console.WriteLine("Base URI"+textReader.BaseURI); Console.WriteLine("Local Name" + textReader.LocalName); Console.WriteLine("value" + textReader.Value); } }