如何完成.Net下XML文档的读写操作
- 格式:doc
- 大小:131.50 KB
- 文档页数:11
读写XML配置⽂件XML配置⽂件代替INI()Imports System.DataPublic Class CLSReadXMLPrivate servername As String'服务器名Private Dbname As String'数据库名称Private Uid As String'数据库⽤户名Private pwd As String'数据库密码Private DSXml As New DataSetPrivate Xpath As String'Xml⽂件路径Sub New(ByVal str As String)Xpath = str'获得xml⽂件存储路径End Sub#Region "属性⽤于写⼊和得到xml⽂件内容的属性"Public Property Getserver()GetReturn servernameEnd GetSet(ByVal Value)servername = ValueEnd SetEnd PropertyPublic Property Getdbname()GetReturn DbnameEnd GetSet(ByVal Value)Dbname = ValueEnd SetEnd PropertyPublic Property Getpwd()GetReturn pwdEnd GetSet(ByVal Value)pwd = ValueEnd SetEnd PropertyPublic Property GetdUid()GetReturn UidEnd GetSet(ByVal Value)Uid = ValueEnd SetEnd Property#End Region#Region "⽅法读写xml⽂件的⽅法当xml⽂件不存在时⾃动创建⼀xml⽂件"'读取xml⽂件内容Public Function ReadXml() As BooleanTryDSXml.ReadXml(Xpath)servername = DSXml.Tables(0).Rows(0)("server")Dbname = DSXml.Tables(0).Rows(0).Item("Dbname")Uid = DSXml.Tables(0).Rows(0).Item("uid")pwd = DSXml.Tables(0).Rows(0).Item("pwd")Return TrueCatch ex As ExceptionThrow exReturn FalseEnd TryEnd Function'如果xml⽂件不存在的时候创建⼀xml⽂件Public Function WriteXml() As BooleanDim DT As New DataTableTryDSXml.Tables.Clear()DSXml.Clear()'给定table列框架DT.Columns.Add("server", GetType(String))Dt.Columns.Add("DBname", GetType(String))Dt.Columns.Add("uid", GetType(String))Dt.Columns.Add("pwd", GetType(String))Dim DR As DataRowDR = Dt.NewRowDR.Item("server") = servername DR.Item("DBname") = Dbname DR.Item("uid") = UidDR.Item("pwd") = pwdDt.Rows.Add(DR)DSXml.Tables.Add(Dt)DSXml.AcceptChanges()DSXml.WriteXml(Xpath)Return TrueCatch ex As ExceptionThrow exReturn FalseEnd TryEnd Function#End RegionEnd Class。
% @ P age Language="C#"%><html><body><h3><font face="Verdana">读取XML方法一</font></h3><from runat=server><asp:Xml id="xml1" DocumentSource="grade.xml" runat="server" /></from></body></html>方法二:使用DOM技术<% @ Page Language="C#"%><% @ Import Namespace="System.Xml"%><% @ Import Namespace="System.Xml.Xsl"%><html><script language="C#" runat="server">void Page_Load(Object sender,EventArgs e){XmlDocument doc=new XmlDocument();doc.Load(Server.MapPath("grade.xml"));xml1.Document=doc;}</script><body><h3><font face="V erdana">读取XML方法二</font></h3><from runat=server><asp:Xml id="xml1" runat="server" /></from></body></html>方法三:使用DataSet对象<% @ Page Language="C#"%><% @ Import Namespace="System.Data"%><% @ Import Namespace="System.Data.OleDb"%><script language="C#" runat="server">void Page_Load(Object sender,EventArgs e){DataSet objDataSet=new DataSet();objDataSet.ReadXml(Server.MapPath("grade.xml")); dgEmployees.DataSource=objDataSet.Tables["student"].DefaultView; dgEmployees.DataBind();}</script><body><h3><font face="V erdana">读取XML方法三</font></h3><asp:DataGrid id="dgEmployees" runat="server" /></body></html>方法四:按文本方式读取<% @ Page Language="C#"%><% @ Import Namespace="System.Xml"%><html><script language="C#" runat="server">private void Page_Load(Object sender,EventArgs e){XmlTextReader objXMLReader=new XmlTextReader(Server.MapPath("grade.xml"));string strNodeResult="";XmlNodeType objNodeType;while(objXMLReader.Read()){objNodeType =objXMLReader.NodeType;swith(objNodeType){case XmlNodeType.XmlDeclaration://读取XML文件头strNodeResult+="XMLDeclaration:<b>"++""+objXMLReader.V alue+"</b><br/>";break;case XmlNodeType.Element://读取标签strNodeResult+="Element:<b>"++"</b><br/>";break;case XmlNodeType.Text://读取值strNodeResult+=" -V alue:<b>"+objXMLReader.V alue+"</b><br/>";break;}//判断该节点是否有属性if(objXMLReader.AttributeCount>0){ //用循环判断完所有节点while(objXMLReader.MoveToNextAttibute){ //取标签和值strNodeResult+=" -Attribute:<b>"++"</b> value:<b>"+objXM LReader.V alue+"</b><br/>";}}LblFile.Text=strNodeResult;}}</script><body><h3><font face="V erdana">读取XML方法四</font></h3> <from runat=server><asp:label id="LblFile" runat="server" /></from></body></html>。
读取写入XML文件Public Class CSysXMLDim mXmlDoc As New System.Xml.XmlDocumentPublic XmlFile As StringPublic Sub New(ByVal File As String)MyClass.XmlFile = FileMyClass.mXmlDoc.Load(MyClass.XmlFile) '加载配置文件End Sub'功能:取得元素值'参数:node--节点 element--元素名'返回:元素值字符型' $--表示出错误Public Function GetElement(ByVal node As String, ByVal element As String) As StringOn Error GoTo ErrDim mXmlNode As System.Xml.XmlNode = mXmlDoc.SelectSingleNode("//" + node)'读数据Dim xmlNode As System.Xml.XmlNode = mXmlNode.SelectSingleNode(element)Return xmlNode.InnerText.T oStringErr:Return "$"End Function''功能:保存元素值'参数:node--节点名称 element--元素名 val--值'返回:True--保存成功 False--保存失败Public Function SaveElement(ByVal node As String, ByValelement As String, ByVal val As String) As BooleanOn Error GoTo errDim mXmlNode As System.Xml.XmlNode = mXmlDoc.SelectSingleNode("//" + node)Dim xmlNodeNew As System.Xml.XmlNodexmlNodeNew = mXmlNode.SelectSingleNode(element)xmlNodeNew.InnerText = valmXmlDoc.Save(MyClass.XmlFile)Return Trueerr:Return FalseEnd FunctionEnd Class例如:XML:192.168.0.6程序调用:Public Class Form1Dim xml As New CSysXML("IP.xml")Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim str As String = xml.GetElement("IP", "num")TextBox1.Text = strEnd SubEnd Class。
//打开某文件(假设web.config在根目录中)string filename=Server.MapPath("/") + @"WebApplication1\web.config";XmlDocument xmldoc= new XmlDocument();xmldoc.Load(filename);//得到顶层节点列表XmlNodeList topM=xmldoc.DocumentElement.ChildNodes;foreach(XmlElement element in topM){if(.ToLower()=="appsettings"){//得到该节点的子节点XmlNodeList nodelist=element.ChildNodes;if ( nodelist.Count >0 ){//DropDownList1.Items.Clear();foreach(XmlElement el in nodelist)//读元素值{//DropDownList1.Items.Add(el.Attributes["key"].InnerXml); //this.TextBox2.Text=el.Attributes["key"].InnerText;this.TextBox2.Text=el.Attributes["key"].Value;bel1.Text=el.Attributes["value"].Value;//同样在这里可以修改元素值,在后面save。
// el.Attributes["value"].Value=this.TextBox2.Text;}}}}xmldoc.Save(filename);}效果:<appSettings><add key="密码" value="admin" /><add key="ltp" value="first" /></appSettings>//添加空元素:XmlNode node=doc.CreateElement(groupname);node.InnerText="";stChild.AppendChild(node);doc.Save(xmlfile);删除一个节点元素string itemname=this.listBox1.SelectedItem.ToString(); this.listBox1.Items.Remove(this.listBox1.SelectedItem);//begin del xmlfileXmlDocument doc=new XmlDocument();doc.Load(xmlfile);XmlNodeList topM=doc.DocumentElement.ChildNodes;foreach(XmlElement element in topM){if(==boBox1.Text){//得到该节点的子节点XmlNodeList nodelist=element.ChildNodes;foreach(XmlElement el in nodelist)//读元素值{if(el.Attributes["key"].Value==itemname){element.RemoveChild(el);}}//循环元素}//得到组}//循环组doc.Save(xmlfile); //一定要保存一下,否则不起作用//筛选数据private void Reader_Xml(string pathFlie){XmlDocument Xmldoc=new XmlDocument();Xmldoc.Load(pathFlie);XmlNodeList Record1=Xmldoc.DocumentElement.SelectNodes(Code[@id='1'])int f=0;foreach(XmlNode xnode in Record1){}} /**//*读取xml数据两种xml方式*/<aaa><bb>something</bb><cc>something</cc></aaa><aaa><add key="123" value="321"/></aaa>/**//*第一种方法*/DS.ReadXml("your xmlfile name");Container.DataItem("bb");Container.DataItem("cc");DS.ReadXmlSchema("your xmlfile name");/**//*第二种方法*/<aaa><add key="123" value="321"/></aaa>如果我要找到123然后取到321应该怎么写呢?using System.XML;XmlDataDocument xmlDoc = new System.Xml.XmlDataDocument();xmlDoc.Load(@"c:\Config.xml");XmlElement elem = xmlDoc.GetElementById("add");string str = elem.Attributes["value"].Value/**//*第三种方法: SelectSingleNode 读取两种格式的xml *---/-------------------------------------------------------------------- <?xml version="1.0" encoding="utf-8" ?><configuration><appSettings><ConnectionString>Data Source=yf; user id=ctm_dbo;password=123</ConnectionString>在某节点下增加一个元素,并设置值:if(.ToLower()=="appsettings"){XmlElement elem =xmldoc.CreateElement("add");element.AppendChild(elem);elem.InnerText="ltp";xmldoc.Save(filename);}效果:<appSettings><add key="密码" value="admin" /><add>ltp</add></appSettings>在某节点下增加一个元素,并增加两个属性:if(.ToLower()=="appsettings"){XmlElement elem =xmldoc.CreateElement("add");element.AppendChild(elem);XmlAttribute xa=xmldoc.CreateAttribute("key");xa.Value="ltp";XmlAttribute xa2=xmldoc.CreateAttribute("value");xa2.Value="first";elem.SetAttributeNode(xa);elem.SetAttributeNode(xa2);xmldoc.Save(filename);</appSettings></configuration>--------------------------------------------------------------------------XmlDocument doc = new XmlDocument();doc.Load(strXmlName);XmlNode node=doc.SelectSingleNode("/configuration/appSettings/ConnectionStrin g");if(node!=null){string k1=node.Value; //nullstring k2=node.InnerText;//Data Source=yf; user id=ctm_dbo;password=123string k3=node.InnerXml;//Data Source=yf; user id=ctm_dbo;password=123node=null;}********************************************************************<?xml version="1.0" encoding="utf-8" ?><configuration><appSettings><add key="ConnectionString" value="Data Source=yf; user id=ctm_dbo;password=123" /></appSettings></configuration>**--------------------------------------------------------------------**XmlNode node=doc.SelectSingleNode("/configuration/appSettings/add");if(node!=null){string k=node.Attributes["key"].Value;string v=node.Attributes["value"].Value;node=null;}*--------------------------------------------------------------------*XmlNode node=doc.SelectSingleNode("/configuration/appSettings/add");if(node!=null){XmlNodeReader nr=new XmlNodeReader(node);nr.MoveToContent();//检查当前节点是否是内容节点。
学习笔记(二十一)XML流的读写System.Xml名称空间支持XML的处理,为了生成和浏览XML文档,使用两种访问方式:一、读写方式(一)基于流的方式特点:速度快,可连续读写,缺点不能作为节点、元素等进行操作,常用于套接字或文件中获取XML文档。
(二)基于文档对象模型(DOM)的方式特点:使用实体(节点、元素和特性)访问,定位灵活,但速度慢,是存储、读取程序设置首选。
(速度慢是因为XML需加载到DOM,故先要将整个文件加载到内存中)二、基于流的XML读写以仅前向的(forward-only)方式读取一块XML,且仅在内存中保存当前节。
流方式时,程序总是指向文档中的当前节点。
(一)XML基本认知XML以元素(结点)来传输和存储数据,各标签成对出现,大小写敏感,严格对齐。
例:XML文档如下:[vb] view plain copyprint?1.<?xml version="1. 0" encoding="utf-8"?>2.<FilmOrder filmId="101”>3.<Name>Grease</Name>4.<Quantity>10</Quantity>5.</FilmOrder>上面XML对应的元素及节点如下:【元素】【节点】XmlDeclaration <?xml version="1.0" encoding="utf-8"?> XmlAttribute Version XML 数据中的元素属性XmlAttribute EncodingXmlElement FilmOrder DOM结构中的元素(节点)XmlAttribute FilmIdXmlElement NameXmlText Grease 文本内容XmlElement NameXmlElement QuantityXmlText 10 文本内容XmlEndElement QuantityXmlWhitespace NothingXmlEndElement FilmOrder(二)XML流的读写访问XML流(读取XML)和生成XML流(写入XML)都包含在System.Xml中。
.Net读取配置⽂件xml直接解析XML⽂件在直接读取⽂件的时候由于⼿动getAttribute很⿇烦,⽽且容易出错,attribute可以参考log4net的⽅式,全部做成宏定义:使⽤.Net提供的的⽅式(ConfigurationManager类,⽀持.Net Core 2)特别说明:using System.Configuration 之后可能还要⼿动勾选,如下图:使⽤.Net 提供的⽅法读取有时候会很⽅便,可以直接将配置信息填写在app.config ⽂件中例如下⾯的配置⽂件读取的时候:<?xml version="1.0" encoding="utf-8" ?><configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup><appSettings><add key="name" value="kun"/><add key="name2" value="kun"/></appSettings><connectionStrings><add name="WingtipToys" connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog=WingtipToys;Integrated Security=True;Pooling=False" /> </connectionStrings></configuration>static void ReadAllSettings(){try{var appSettings = ConfigurationManager.AppSettings;if (appSettings.Count == 0){Console.WriteLine("AppSettings is empty.");}else{foreach (var key in appSettings.AllKeys.Where((key) => key == "name")){Console.WriteLine("Key: {0} Value: {1}", key, appSettings[key]);}}}catch (ConfigurationErrorsException){Console.WriteLine("Error reading app settings");}}static void ReadSetting(string key){try{var appSettings = ConfigurationManager.AppSettings;string result = appSettings[key] ?? "Not Found";Console.WriteLine(result);}catch (ConfigurationErrorsException){Console.WriteLine("Error reading app settings");}}读取数据库连接信息也可以只⽤⼀句代码:var connectionString = ConfigurationManager.ConnectionStrings["WingtipToys"].ConnectionString;对于这种简单key/Value⽅式的配置,使⽤ConfigurationManager类还是很⽅便的。
读写XML配置文件2009-04-08 16:58在WinCE中不能使用相对路径,必须获得配置文件的绝对路径WinCE中不支持System.IO.Directory.GetCurrentDirectory()Dim curDir As StringcurDir =System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecuti ngAssembly().GetName().CodeBase)Dim strFileName As String = curDir + "\config.xml"Dim fileInfo As New IO.FileInfo(strFileName)Dim xmlReader As System.Xml.XmlDocumentxmlReader = New Xml.XmlDocumentDim nodeList As Xml.XmlNodeListIf Not fileInfo.Exists ThenMessageBox.Show(strFileName + " does not exist") ElsexmlReader.Load(strFileName)nodeList =xmlReader.GetElementsByTagName("SystemName")MessageBox.Show(nodeList(0).Attributes(0).Valu e.ToString)End If---------------------------------------------------------------------------------------------------------------------------------Dim strFileName As String = "\Config.xml"Dim strFileFullPath As String =Directory.GetCurrentDirectory() + strFileNameDim strFile As FileInfo = New FileInfo(strFileFullPath)If strFile.Exists ThenConsole.WriteLine(strFileName + " Exists !") ElseConsole.WriteLine(strFileName + " Not Exists !") End IfDim xmlReader As Xml.XmlDocument = New Xml.XmlDocumentxmlReader.Load(strFileFullPath)Dim root As Xml.XmlNode = xmlReader.DocumentElementConsole.WriteLine(" Root = " + )Console.WriteLine(" Root ChildNotes is {0:D}",root.ChildNodes(1).Attributes(0).Value)root.ChildNodes(1).Attributes(0).Value = "123456789"xmlReader.Save(strFileFullPath)配置文件config.xml和程序放在同一个目录下,具体数据如下:<DMConfig><TSServer value="abcdefg" /><SystemName value="444444444444444" /><LogsPath value="2222222222222222" /><USBStickName value="33333333333333" /><USBSleepTimer value="25" /><IntroFilePath value="fffffffffffffff" /><AppFilePath value="ddddddddddddddd" /></DMConfig>。
本人在.Net下学习 XML 的过程中,对如何完成 XML 文档的读写操作进行了简单的总结,遂与大家分享。
这是一篇入门级别的文章,高手可以置之脑后,或高屋建瓴的指点一下,不胜感激! ^_^一 .Net框架中与XML有关的命名空间System.Xml包含了一些和XML文档的读写操作相关的类,它们分别是:XmlReader、XmlTextReader、XmlValidatingReader、XmlNodeReader、XmlWriter、XmlTextWriter 以及XmlNode(它的子类包括:XmlDocument、XmlDataDocument、XmlDocumentFragment)等类。
System.Xml.Schema包含了和XML模式相关的类,这些类包括XmlSchema、XmlSchemaAll、XmlSchemaXPath以及XmlSchemaType等类。
System.Xml.Serialization包含了和XML文档的序列化和反序列化操作相关的类。
序列化:将XML格式的数据转化为流格式的数据,并能在网络中传输;反序列化:完成相反的操作,即将流格式的数据还原成XML格式的数据。
System.Xml.Xpath包含了XPathDocument、XPathExression、XPathNavigator以及XPathNodeIterator等类,这些类能完成XML文档的导航功能。
(在XPathDocument类的协助下,XPathNavigator类能完成快速的XML文档导航功能,该类为程序员提供了许多Move方法以完成导航功能。
)System.Xml.Xsl完成XSLT的转换功能。
二写XML文档的方法用XmlWriter类实现写操作,该类包含了写XML文档所需的方法和属性,它是XmlTextWriter类和XmlNodeWriter类的基类。
写操作的有些方法是成对出现的,比如你要写入一个元素,首先调用WriteStartElement 方法—>写入实际内容—>调用WriteEndElement方法结束。
下面通过其子类 XmlTextWriter 来说明如何写XML文档。
XmlTextWriter textWriter = New XmlTextWriter("C:\\myXmFile.xml", null);在创建完对象后,我们调用WriterStartDocument方法开始写XML文档;在完成写工作后,就调用WriteEndDocument结束写过程,并调用Close方法将它关闭。
在写的过程中,我们可以:调用WriteComment方法来添加说明;通过调用WriteString方法来添加一个字符串;通过调用WriteStartElement和WriteEndElement方法对来添加一个元素;通过调用WriteStartAttribute和WriteEndAttribute方法对来添加一个属性;通过调用WriteNode方法来添加整的一个节点;其它的写的方法还包括WriteProcessingInstruction和WriteDocType等等。
下面的示例介绍如何具体运用这些方法来完成XML文档的写工作。
using System;using System.Xml;namespace WriteXML{class Class1{static void Main( string[] args ){try{// 创建XmlTextWriter类的实例对象XmlTextWriter textWriter = new XmlTextWriter("C:\\w3sky.xml", ntextWriter.Formatting = Formatting.Indented;// 开始写过程,调用WriteStartDocument方法textWriter.WriteStartDocument();// 写入说明textWriter.WriteComment("First Comment XmlTextWriter Sample Exa mple");textWriter.WriteComment("w3sky.xml in root dir");//创建一个节点textWriter.WriteStartElement("Administrator");textWriter.WriteElementString("Name", "formble");textWriter.WriteElementString("site", "");textWriter.WriteEndElement();// 写文档结束,调用WriteEndDocument方法textWriter.WriteEndDocument();// 关闭textWritertextWriter.Close();catch(System.Exception e){Console.WriteLine(e.ToString());}}}}三读XML文档的方法用XmlTextReader类的对象来读取该XML文档。
在创建新对象的构造函数中指明XML文件的位置即可。
XmlTextReader textReader = new XmlTextReader("C:\\books.xml"); XmlTextReader 类中的属性 NodeType 可以知道其节点的节点类型。
通过与枚举类型XmlNodeType 中的元素的比较,可以获取相应节点的节点类型并对其完成相关的操作。
枚举类型 XmlNodeType 中包含了诸如XmlDeclaration、Attribute、CDATA、Element、Comment、Document、DocumentType、Entity、ProcessInstruction以及WhiteSpace等XML项的类型。
下面的示例是以读取"books.xml"文件创建对象,通过该xml对象的Name、BaseURI、Depth、LineNumber等属性来获取相关信息,并显示在控制台中。
(运用开发工具附带的"books.xml"文件来作为示例)using System;using System.Xml;namespace ReadXml{class Class1{static void Main( string[] args ){// 创建一个XmlTextReader类的对象并调用Read方法来读取XML文件XmlTextReader textReader = new XmlTextReader("C:\\book s.xml");textReader.Read();// 节点非空则执行循环体while ( textReader.Read() ){// 读取第一个元素textReader.MoveToElement();Console.WriteLine("XmlTextReader Properties Test");Console.WriteLine("===================");// 读取该元素的属性并显示在控制台中Console.WriteLine("Name:" + );Console.WriteLine("Base URI:" + textReader.BaseURI);Console.WriteLine("Local Name:" + textReader.LocalN ame);Console.WriteLine("Attribute Count:" + textReader.A ttributeCount.ToString());Console.WriteLine("Depth:" + textReader.Depth.ToString());Console.WriteLine("Line Number:" + textReader.LineN umber.ToString());Console.WriteLine("Node Type:" + textReader.NodeTyp e.ToString());Console.WriteLine("Attribute Count:" + textReader.V alue.ToString());}}}}四运用XmlDocument类XmlDocument类代表了XML文档,它能完成与整个XML文档相关的各类操作,同时和其相关的XmlDataDocument类也是非常重要的,值得深入研究。
该类包含了Load、LoadXml以及Save等重要的方法。
Load方法: 可以从一个字符串指定的XML文件或是一个流对象、一个TextReader对象、一个XmlReader对象导入XML数据。
LoadXml方法: 则完成从一个特定的XML文件导入XML数据的功能。
Save方法: 则将XML数据保存到一个XML文件中或是一个流对象、一个TextWriter对象、一个XmlWriter对象中。
下面的示例中,用到了XmlDocument类对象的LoadXml方法,它从一个XML文档段中读取XML数据并调用其Save方法将数据保存在一个文件中。
// 创建一个XmlDocument类的对象XmlDocument doc = new XmlDocument();doc.LoadXml(("<Student type='regular' Section='B'><Name>Tommy Lex</Name></Student>"));// 保存到文件中doc.Save("C:\\student.xml");// 还可以通过改变Save方法中参数,将XML数据显示在控制台中,方法如下:doc.Save(Console.Out);下面的示例中,用到了一个XmlTextReader对象,通过它读取"books.xml"文件中的XML数据。