第10章 可擴展標(biāo)記語言_第1頁
第10章 可擴展標(biāo)記語言_第2頁
第10章 可擴展標(biāo)記語言_第3頁
第10章 可擴展標(biāo)記語言_第4頁
第10章 可擴展標(biāo)記語言_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第十章可擴展標(biāo)記語言學(xué)習(xí)目的掌握XML可擴展標(biāo)記語言的基本概念和使用。能夠建立、顯示和處理XML文檔數(shù)據(jù)能夠?qū)ML數(shù)據(jù)和數(shù)據(jù)庫數(shù)據(jù)進行轉(zhuǎn)換主要內(nèi)容10.1XML基本概念10.2XML文檔顯示10.3查詢XML文檔10.4編輯XML文檔10.5XML架構(gòu)10.6數(shù)據(jù)庫和XML

10.1XML基本概念XML是基于文本的標(biāo)記語言,它通過有意義的標(biāo)簽以結(jié)構(gòu)化的格式存儲數(shù)據(jù),能夠描述矢量圖形、數(shù)學(xué)公式、化學(xué)符號等數(shù)據(jù),這種格式可以被任何一種計算機系統(tǒng)所解釋。XML描述數(shù)據(jù)的另一優(yōu)點是數(shù)據(jù)和顯示數(shù)據(jù)的格式分離。10.1.1SGML(標(biāo)準通用標(biāo)記語言)SGML(StandardGeneralizedMarkupLanguage)是一種通用的文檔結(jié)構(gòu)描述標(biāo)記語言,為文檔數(shù)據(jù)的標(biāo)記提供了異常強大的工具,同時具有極好的擴展性,因此在數(shù)據(jù)分類和索引中非常有用。但SGML復(fù)雜度太高,不適合網(wǎng)絡(luò)的日常應(yīng)用,加上開發(fā)成本高、不被主流瀏覽器所支持等原因,使得SGML推廣受到阻礙。10.1.2XML(可擴展標(biāo)記語言)XML(eXtensibleMarkupLanguage)是由W3C于1998年2月發(fā)布的標(biāo)準,它是SGML的一個簡化子集,它具有SGML的豐富功能,同時易于使用。XML優(yōu)點如下:XML簡單易用,功能強大。XML允許各個組織、個人建立適合自己需要的標(biāo)記集合,并且這些標(biāo)記可以用通用的工具顯示。XML的最大優(yōu)點在于它的數(shù)據(jù)存儲格式不受顯示格式的制約。通過有意義的標(biāo)簽以結(jié)構(gòu)化的格式存儲數(shù)據(jù),用一種開放的自我描述方式定義數(shù)據(jù)結(jié)構(gòu)。XML還有其他許多優(yōu)點,比如它有利于不同系統(tǒng)之間的信息交流,完全可以充當(dāng)網(wǎng)際語言,并有希望成為數(shù)據(jù)和文檔交換的標(biāo)準。10.1.3XML的文檔格式首先介紹XML文檔內(nèi)容的基本單元——元素,它的語法格式如下:〈標(biāo)簽〉文本內(nèi)容〈/標(biāo)簽〉元素是由起始標(biāo)簽、元素內(nèi)容和結(jié)束標(biāo)簽組成。用戶把要描述的數(shù)據(jù)對象放在起始標(biāo)簽和結(jié)束標(biāo)簽之間。例如:<姓名>王平</姓名>。無論文本內(nèi)容有多長或者多么復(fù)雜,XML元素中可以再嵌套別的元素,這樣使相關(guān)信息構(gòu)成等級結(jié)構(gòu)。用這樣的方法定義XML文檔數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu)?!纠?0.1】下面的例子是一個描述學(xué)生情況的XML文檔,用IE瀏覽器(5.0以上版本)瀏覽e10_1.xml文件,效果如圖10.1。完整XML文件e10_1.xml內(nèi)容如下:<?xmlversion="1.0"encoding="GB2312"?><學(xué)生列表><學(xué)生編號="001"><姓名>張三</姓名><性別>男</性別><年齡>20</年齡></學(xué)生><學(xué)生編號="002"><姓名>李四</姓名><性別>女</性別><年齡>19</年齡> </學(xué)生></學(xué)生列表>

XML文檔中出現(xiàn)的有效對象是:聲明:聲明給XML解析器提供信息,使其能夠正確解釋文檔內(nèi)容,它的起始標(biāo)識是"<?",結(jié)束標(biāo)識是"?>"。注釋:注釋是XML文件中用作解釋的字符數(shù)據(jù),XML處理器不對它們進行任何處理。注釋文本被"<!--"和"-->"標(biāo)記,注釋可以出現(xiàn)在XML元素間的任何地方,但是不可以嵌套。根元素和子元素:如果一個元素從文件頭的序言部分之后開始,一直到文件尾,包含了文件中所有的數(shù)據(jù)信息,稱為根元素。XML元素是可嵌套的,那么被嵌套在內(nèi)的元素稱為子元素。一個XML文檔中有且僅有一個根元素,其他所有的元素都是它的子元素。屬性:屬性給元素提供進一步的說明信息,它必須出現(xiàn)在起始標(biāo)簽中。屬性以名稱/值成對出現(xiàn),屬性名不能重復(fù),名稱與取值之間用等號分隔,取值用引號括起來。XML文檔的基本結(jié)構(gòu):XML文檔的基本結(jié)構(gòu)由序言部分和一個根元素組成。序言包括了XML聲明和DTD或XSD聲明,DTD(DocumentTypeDefine,文檔類型定義)和XSD(XMLSchema,XML架構(gòu))都是用來描述XML文檔的數(shù)據(jù)結(jié)構(gòu)的(參見10.5節(jié))。例如,在例10.1的XML文件e10_1.xml文檔前面加上如下的序言部分,就構(gòu)成了一個完整的XML文檔:<?xmlversion="1.0"encoding="GB2312"?><!DOCTYPEstudentsSYSTEM"e10_1.dtd">格式良好的(Well-Formed)XML文檔:一個XML文檔首先應(yīng)當(dāng)是格式良好的,格式良好XML文檔的正式定義位于:/TR/REC-xml。格式良好的XML文檔除了要滿足根元素惟一的特性之外,還包括:(1)起始標(biāo)簽和結(jié)束標(biāo)簽應(yīng)當(dāng)匹配,結(jié)束標(biāo)簽是必不可少的。(2)大小寫應(yīng)一致,XML對字母的大小寫是敏感的,<employee>和<Employee>是完全不同的兩個標(biāo)簽,所以結(jié)束標(biāo)簽在匹配時一定要注意大小寫一致。(3)元素應(yīng)當(dāng)正確嵌套,子元素應(yīng)當(dāng)完全包括在父輩元素中,下面例子就是錯誤嵌套:<A><B></A></B>,正確的嵌套方式如下:<A><B></B></A>。(4)屬性值必須包括在引號中,元素中的屬性名是不允許重復(fù)的。10.1.4XPath表示XML文檔路徑XPath表達式說明例10.1中位置第一個元素為/絕對路徑,從根節(jié)點開始/學(xué)生列表,<學(xué)生列表>元素其余/在路徑中分割元素/學(xué)生列表/學(xué)生,從根開始的所有學(xué)生元素第一個元素為//相對路徑,從指定元素開始//學(xué)生/姓名,所有學(xué)生姓名元素@元素名稱屬性//學(xué)生/@編號,所有學(xué)生編號*選擇路徑的任何元素//學(xué)生/*,所有學(xué)生的編號、姓名、性別和年齡@*所有屬性/所有學(xué)生/@*,所有編號.當(dāng)前元素..父元素如當(dāng)前為學(xué)生元素,則指向?qū)W生列表元素[]篩選條件//學(xué)生[@編號='002'],編號為1的學(xué)生元素10.2XML文檔顯示XML文件可用IE瀏覽器顯示,由于XML文檔僅定義數(shù)據(jù)及其數(shù)據(jù)結(jié)構(gòu),并不包含顯示格式,如不另定義顯示格式,顯示效果類似圖10.1。如希望IE按指定格式顯示這些數(shù)據(jù),必須使用CSS文件或XSL文件定義顯示格式。WPF應(yīng)用程序可使用數(shù)據(jù)綁定方法顯示XML文件。10.2.1定義XML文檔顯示格式【例10.2】用一個xsl文件e10_2.xsl定義e10_1.xml顯示格式。xsl文件如下:<?xmlversion="1.0"encoding="GB2312"?><xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform"><xsl:templatematch="/"><xsl:for-eachselect="學(xué)生列表/學(xué)生"><xsl:value-ofselect="@編號"/>,<xsl:value-ofselect="姓名"/>,<xsl:value-ofselect="性別"/>,<xsl:value-ofselect="年齡"/></xsl:for-each></xsl:template></xsl:stylesheet>【例10.3】html標(biāo)記是用來描述網(wǎng)頁的數(shù)據(jù)和顯示格式。在xsl文件中可以使用html標(biāo)記,上例中逗號和<br>標(biāo)記都是html標(biāo)記,另一個xsl文件e10_3.xsl以表格的形式顯示e10_1.xml文件。e10_3.xsl文件如下: <?xmlversion="1.0"encoding="GB2312"?><xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform"><xsl:templatematch="/"><tableborder="1"bordercolor="#111111"><tr><td>編號</td><td>姓名</td><td>性別</td><td>年齡</td></tr><xsl:for-eachselect="學(xué)生列表/學(xué)生">

<tr><td><xsl:value-ofselect="@編號"/></td><td><xsl:value-ofselect="姓名"/></td><td><xsl:value-ofselect="性別"/></td><td><xsl:value-ofselect="年齡"/></td></tr></xsl:for-each></table></xsl:template></xsl:stylesheet>10.2.2XML文件轉(zhuǎn)換為HTML文件【例10.4】本例將e10_3.xml文件,按照e10_3.xsl定義的顯示格式生成HTML文件e10_4.htm。建立新項目,在window1.xaml.cs文件頭部增加引用如下命名空間語句:usingSystem.Xml;usingSystem.Xml.Xsl;增加一個按鈕,其事件函數(shù)如下。用瀏覽器IE顯示e10_4.html效果和例12.3相同。privatevoidbutton1_Click(objectsender,RoutedEventArgse){XslCompiledTransformxslt=newXslCompiledTransform();xslt.Load(@"E:\應(yīng)用程序設(shè)計教程(第二版)\Example\ch10\e10_4\XML文件轉(zhuǎn)換為HTML文件\e10_3.xsl");xslt.Transform(@"E:\應(yīng)用程序設(shè)計教程(第二版)\Example\ch10\e10_4\XML文件轉(zhuǎn)換為HTML文件\e10_3.xml","e10_4.html");}10.2.3TreeView控件和Xml數(shù)據(jù)綁定【例10.5】本例使用ListView控件顯示例e10_1的xml文檔。創(chuàng)建新項目。單擊"項目|添加現(xiàn)有項"菜單項,將e10_1.xml文件增加到項目中。用如下標(biāo)記替換Window1.xaml文件中Grid標(biāo)記。<Window.Resources><XmlDataProviderx:Key="e10_1XmlDoc"Source="E:\應(yīng)用程序設(shè)計教程(第二版)\Example\ch10\e10_5\XML綁定到ListView\e10_1.xml"/></Window.Resources><Grid><ListViewHeight="89"Margin="17,22,22,0"Name="listView1"VerticalAlignment="Top"ItemsSource="{BindingSource={StaticResourcee10_1XmlDoc},XPath=/學(xué)生列表/學(xué)生}"><ListView.View><GridView><GridViewColumnWidth="100"Header="編號"DisplayMemberBinding="{BindingXPath=@編號}"/><GridViewColumnWidth="100"Header="姓名"DisplayMemberBinding="{BindingXPath=姓名}"/><GridViewColumnWidth="100"Header="性別"DisplayMemberBinding="{BindingXPath=性別}"/><GridViewColumnWidth="150"Header="年齡"DisplayMemberBinding="{BindingXPath=年齡}"/></GridView></ListView.View></ListView></Grid>【例10.6】本例在XAML標(biāo)記中定義XML文檔,用ListView控件顯示這個XML文檔。 <StackPanelHeight="53"><StackPanel.Resources><XmlDataProviderx:Key="Students"><x:XData><所有學(xué)生xmlns=""><學(xué)生學(xué)號="001">張三</學(xué)生><學(xué)生學(xué)號="002">李四</學(xué)生><學(xué)生學(xué)號="003">王五</學(xué)生></所有學(xué)生></x:XData></XmlDataProvider></StackPanel.Resources><ListBoxWidth="87"Height="47"ItemsSource="{BindingSource={StaticResourceStudents},XPath=/所有學(xué)生/學(xué)生}"><ListBox.ItemTemplate><DataTemplate><StackPanelOrientation="Horizontal"><TextBlockText="{BindingXPath=@學(xué)號}"/><TextBlockText="{BindingXPath=.}"/></StackPanel></DataTemplate></ListBox.ItemTemplate></ListBox></StackPanel>【例10.7】本例使用TreeView控件顯示學(xué)生學(xué)號和姓名。在Grid標(biāo)記中填入如下標(biāo)記。<TreeView><TreeViewItemHeader="所有學(xué)生"><TreeViewItemHeader="001">張三</TreeViewItem><TreeViewItemHeader="002">李四</TreeViewItem><TreeViewItemHeader="003">王五</TreeViewItem></TreeViewItem></TreeView>XML文檔只有一個根元素,根元素中還可以嵌入子元素,子元素還可以有子元素,因此XML文檔具有層次結(jié)構(gòu),因此也可以使用TreeView控件顯示。為了顯示XML文檔,必須使用HierarchicalDataTemplate類為TreeView控件每一節(jié)點定義模板。【例10.8】本例說明如何將TreeView控件綁定到例10.1中的XML文檔。標(biāo)記如下: <StackPanelHeight="91"><StackPanel.Resources><HierarchicalDataTemplateDataType="所有學(xué)生"ItemsSource="{BindingXPath=*}"><TextBlockFontStyle="Italic"Text="所有學(xué)生"/></HierarchicalDataTemplate><HierarchicalDataTemplateDataType="學(xué)生"ItemsSource="{BindingXPath=*}"><TextBlockFontWeight="Bold"FontSize="14"Text="{BindingXPath=@學(xué)號}"/></HierarchicalDataTemplate><DataTemplateDataType="姓名"><TextBlockForeground="Blue"Text="{BindingXPath=.}"/></DataTemplate><XmlDataProviderx:Key="Students"XPath="所有學(xué)生"><x:XData>

<所有學(xué)生xmlns=""><學(xué)生學(xué)號="001"><姓名>張三</姓名></學(xué)生><學(xué)生學(xué)號="002"><姓名>李四</姓名></學(xué)生><學(xué)生學(xué)號="003"> <姓名>王五</姓名></學(xué)生></所有學(xué)生></x:XData></XmlDataProvider></StackPanel.Resources><TreeViewName="treeView1"ItemsSource="{BindingSource={StaticResourceStudents},XPath=.}"/></StackPanel>10.3查詢XML文檔查詢XML文檔是指讀取或查找XML文檔指定數(shù)據(jù)或標(biāo)記。可使用XmlTextReader、XmlDocument、XPathNavigator和XDocument類實現(xiàn)查詢。10.3.1XmlTextReader類查詢XML

XmlTextReader類可以讀取XML文件,但只提供非緩存的只進、只讀訪問。這意味著使用XmlTextReader無法編輯屬性值或元素內(nèi)容,也無法插入和移除節(jié)點?!纠?0.9】本例用來讀出e10_1.xml文件中每個學(xué)生的姓名、性別和年齡等數(shù)據(jù)。使用XmlTextReader類讀XML文檔各種元素只能順序讀出。在Window1.xaml.cs文件頭部增加引用命名空間語句:usingSystem.Xml;在Window1窗體放置ListBox控件,Name屬性為listBox1,在Window1類構(gòu)造函數(shù)最后增加如下語句。XmlTextReaderdr=newXmlTextReader("e10_1.xml"); //xml文件和可執(zhí)行文件在同一目錄while(dr.Read())if(dr.NodeType==XmlNodeType.Text)listBox1.Items.Add(dr.Value); XML文檔的節(jié)點分為兩大類,第一類是文本節(jié)點,即XML文檔的數(shù)據(jù)。在兩個標(biāo)記之間的文本被稱為一個文本節(jié)點。第二類是非數(shù)據(jù)節(jié)點,它又可以分為以下幾大類:注釋節(jié)點聲明節(jié)點開始標(biāo)記節(jié)點結(jié)束標(biāo)記節(jié)點【例10.10】本例用來讀出e10_1.xml文件學(xué)生標(biāo)記的編號屬性。修改上例代碼如下:XmlTextReaderdr=newXmlTextReader("e10_1.xml");while(dr.Read())if(dr.NodeType==XmlNodeType.Element)//判斷是否為開始標(biāo)記for(inti=0;i<dr.AttributeCount;i++) listBox1.Items.Add(dr.GetAttribute(i));【例10.11】如果顯示e10_1.xml文檔注釋,修改上例代碼如下:XmlTextReaderdr=newXmlTextReader("e10_1.xml");while(dr.Read()) if(dr.NodeType==XmlNodeType.Comment) //e10_1.xml文檔無注釋 listBox1.Items.Add(dr.Value);【例10.12】如果顯示e10_1.xml文檔聲明,修改上例代碼如下:XmlTextReaderdr=newXmlTextReader("e10_1.xml");while(dr.Read()) if(dr.NodeType==XmlNodeType.XmlDeclaration) listBox1.Items.Add(dr.Name+""+dr.Value);10.3.2XmlDocument類查詢XMLXmlDocument是文檔對象模型(DOM)類,是XML文檔在內(nèi)存中表示形式。DOM使程序員能夠以編程方式讀取、操作和修改XML文檔。DOM的節(jié)點的概念和上節(jié)敘述的概念完全相同,因此也可以使用類似XmlTextReader類的方法讀出XML文檔的數(shù)據(jù)和非數(shù)據(jù)節(jié)點。下邊僅給出讀出XML文檔的數(shù)據(jù)的例子,讀XML文檔中的非數(shù)據(jù)節(jié)點請讀者完成?!纠?0.13】使用XML文檔對象模型(DOM)讀出e10_1.xml文件中每個學(xué)生的姓名、性別和年齡等數(shù)據(jù)。修改例10.9代碼如下:XmlDocumentdoc=newXmlDocument();//創(chuàng)建XmlDocument類的實例doc.Load("e10_1.xml");//xml文件和可執(zhí)行文件在同一目錄。讀XML文件到內(nèi)存,形成DOM結(jié)構(gòu)XmlNodeReaderdr=newXmlNodeReader(doc);while(dr.Read()) if(dr.NodeType==XmlNodeType.Text) listBox1.Items.Add(dr.Value);【例10.14】本例顯示XML文件e10_1.xml的所有學(xué)生姓名。修改例10.9代碼如下:XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml"); //下句得到XML文檔中"姓名"節(jié)點放到節(jié)點數(shù)組中XmlNodeListelemList=doc.GetElementsByTagName("姓名");for(inti=0;i<elemList.Count;i++){listBox1.Items.Add(elemList[i].InnerXml);}【例10.15】本例用XPath語言查詢實現(xiàn)例10.13相同功能,修改例10.9代碼如下:XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml");XmlNodeListnodes=doc.SelectNodes("/學(xué)生列表/學(xué)生")//所有學(xué)生元素foreach(XmlNodenodeinnodes) //分別取出每個學(xué)生元素{for(inti=0;i<node.ChildNodes.Count;i++)//學(xué)生子元素有3個,是<姓名>、<性別>、<年齡>{//下條語句參數(shù)i=0的值是姓名的值,i=1的值是性別的值,i=2的值是年齡的值listBox1.Items.Add(node.ChildNodes[i].FirstChild.Value);}}【例10.16】本例用XPath語言查詢實現(xiàn)例10.14相同功能,修改例10.9代碼如下:

XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml");XmlNodeListnodes=doc.SelectNodes("http://學(xué)生/姓名");foreach(XmlNodenodeinnodes) {listBox1.Items.Add(node.FirstChild.Value);}【例10.17】用XPath語言查詢編號=002的學(xué)生姓名,修改例10.9代碼如下:

XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml");//XmlNodenode=doc.SelectSingleNode("http://學(xué)生[contains(@編號,'002')]"); //此句也正確

XmlNodenode=doc.SelectSingleNode("http://學(xué)生[@編號='002']");listBox1.Items.Add(node.ChildNodes[0].FirstChild.Value);10.3.3XPathNavigator類查詢XMLXPathNavigator類和XmlDocument類的工作方式類似,在內(nèi)存中處理XML文檔,允許移動節(jié)點,關(guān)鍵的區(qū)別是XPathNavigator采用游標(biāo)方式,使用MoveToNext()之類的方法向前或向后移動節(jié)點。一般從XmlDocument類對象導(dǎo)出XPathNavigator類對象?!纠?0.18】用XPathNavigator類讀出e10_1.xml文件中每個學(xué)生的編號、姓名、性別和年齡等數(shù)據(jù)。修改例10.9,添加引用命名空間語句:usingSystem.Xml.XPath;增加一個方法如下: voidgetAllText(XPathNavigatorxnav){if(xnav.NodeType==XPathNodeType.Text) listBox1.Items.Add(xnav.Value);if(xnav.HasAttributes){xnav.MoveToFirstAttribute(); do{listBox1.Items.Add(xnav.Value);}while(xnav.MoveToNextAttribute());xnav.MoveToParent();}

if(xnav.HasChildren){xnav.MoveToFirstChild(); do{getAllText(xnav); }while(xnav.MoveToNext());xnav.MoveToParent();}}刪除原在Window1構(gòu)造函數(shù)中代碼,增加代碼如下:

XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml");XPathNavigatorxnav=doc.CreateNavigator();getAllText(xnav);10.3.4XDocument和LINQtoXML為了實現(xiàn)LINQtoXML,.Net3.5引入了System.Xml.Linq命名空間,在該命名空間中,引入了若干類用來操作XML文檔,包括用XDocument類代表整個XML文檔,用XElement類代表XML文檔中某個元素,用XAttribute類代表XML文檔節(jié)點屬性,用XComment類代表XML文檔注釋,用XDeclaration類代表XML文檔聲明,用XName類代表XML命名空間。使用這些類,采用不同于XMLDocument類的方式,能夠更快捷方便地操作XML文檔,下邊用例子說明LINQtoXML用法。【例10.19】本例查找e10_1.xml所有學(xué)生的姓名。修改例10.9代碼如下: XElementxDoc=XElement.Load("e10_1.xml");varAllName=fromaNameinxDoc.Descendants("姓名")selectaName.Value;foreach(varnameinAllName)listBox1.Items.Add(name.ToString());【例10.20】本例查找e10_1.xml編號為001的學(xué)生姓名,上例LINQ語句修改如下:varAllName=fromaNameinxDoc.Descendants("學(xué)生")where(string)aName.Attribute("編號")=="001"selectaName.Element("姓名").Value;【例10.21】如果查找e12_18.xml所有女學(xué)生的姓名,上例LINQ語句修改如下:varAllName=fromaNameinxDoc.Descendants("學(xué)生")where(string)aName.Element("性別")=="女"selectaName.Element("姓名").Value;10.4編輯XML文檔10.4.1XmlTextWriter類寫XML文檔

XmlTextWriter類提供了快速、非緩存、只進方法生成XML文檔的方法,可以生成包含XML數(shù)據(jù)的流或文件。該類屬性Formatting為Formatting.None,表示不使用特殊的格式設(shè)置XML文檔,這是默認選項;如果為Formatting.Indented,表示使子元素根據(jù)Indentation和IndentChar設(shè)置縮進?!纠?0.22】本例用XmlTextWriter類生成一個XML文檔,建立新項目,增加引用命名空間語句:usingSystem.Xml;在窗體增加一個按鈕,按紐單擊事件函數(shù)如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){System.IO.FileStreammyFileStream=newSystem.IO.FileStream("e10_22.xml",System.IO.FileMode.Create);XmlTextWriterwriter=newXmlTextWriter(myFileStream,System.Text.Encoding.Unicode);writer.Formatting=Formatting.Indented;writer.WriteStartElement("學(xué)生"); writer.WriteAttributeString("編號","001");writer.WriteElementString("姓名","張三"); writer.WriteElementString("性別","男");writer.WriteElementString("年齡","20");writer.WriteEndElement(); writer.Close();}用程序?qū)懗龅腦ML文檔的書局格式如下:<學(xué)生編號="001"> <姓名>張三</姓名> <性別>男</性別> <年齡>20</年齡></學(xué)生>10.4.2XmlDocument類編輯XML文檔

XmlDocument類使程序員能夠以編程方式創(chuàng)建、編輯和刪除XML文檔內(nèi)容?!纠?0.23】用XmlDocument類創(chuàng)建一個XML文檔。修改例10.22按鈕事件函數(shù)如下: privatevoidbutton1_Click(objectsender,RoutedEventArgse){XmlDocumentdoc=newXmlDocument();doc.LoadXml("<bookISBN='1-861001-57-5'>"+"<title>小布頭歷險記</title>"+"</book>");doc.Save("e10_23.xml"); }【例10.24】為例10.23創(chuàng)建的e10_23.xml文件增加一個新節(jié)點。修改例10.22,首先將e10_23.xml文件拷貝到生成的可執(zhí)行文件所在文件夾,修改例10.22按鈕事件函數(shù)如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XmlDocumentdoc=newXmlDocument();doc.Load("e10_23.xml");XmlNoderoot=doc.DocumentElement;

XmlElementelem=doc.CreateElement("價格");

elem.InnerText="19.95"; root.AppendChild(elem);

doc.Save("e10_24.xml");}【例10.25】為例10.23創(chuàng)建的e10_23.xml文件增加一個新屬性。修改例10.24,首先將e10_23.xml文件拷貝到生成的可執(zhí)行文件所在文件加,修改例10.24按鈕事件函數(shù)如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XmlDocumentdoc=newXmlDocument();doc.Load("e10_23.xml");XmlAttributenewAttr=doc.CreateAttribute("類別"); newAttr.Value="小說";XmlAttributeCollectionattrColl=doc.DocumentElement.Attributes; attrColl.Append(newAttr);doc.Save("e10_25.xml"); }【例10.26】查找e10_1.xml文檔指定節(jié)點,修改該節(jié)點數(shù)據(jù)。修改例10.24,首先將e10_1.xml文件拷貝到生成的可執(zhí)行文件所在文件加,修改例10.24按鈕事件函數(shù)如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml"); XmlNodestudent;XmlNoderoot=doc.DocumentElement; student=root.SelectSingleNode("descendant::學(xué)生[姓名='張三']");student["年齡"].InnerText="22";doc.Save("e10_26.xml");}10.4.3XDocument編輯XML文檔【例10.27】本例用語句生成和XML文件e10_1.xml相同的XML文件e10_27.xml。創(chuàng)建新項目,增加如下命名空間:usingSystem.Xml;usingSystem.Xml.Linq;放置Button控件到窗體,其屬性Content="用程序?qū)慩ML文件",其事件函數(shù)如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XDocumentxDoc=newXDocument(newXDeclaration("1.0","GB2312","yes"),newXComment("這是一個注釋"),newXElement("學(xué)生列表",

newXElement("學(xué)生",newXAttribute("編號","001"),newXElement("姓名","張三"),newXElement("性別","男"),newXElement("年齡","20")),newXElement("學(xué)生",newXAttribute("編號","002"),newXElement("姓名","李四"),newXElement("性別","女"),newXElement("年齡","19"))));xDoc.Save("e10_27.xml");}編譯運行后,單擊按鈕,創(chuàng)建XML文件e10_27.xml,可用IE瀏覽器查看該文件。【例10.28】本例為XML文件e10_27.xml增加一個學(xué)生節(jié)點。修改上例,修改按紐控件標(biāo)題為"增加學(xué)生節(jié)點",其事件函數(shù)如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XElementxDoc=XElement.Load("e10_27.xml"); //該文件必須和可執(zhí)行文件在同一文件夾XElementxel=newXElement("學(xué)生",newXAttribute("編號","003"),newXElement("姓名","王五"),newXElement("性別","女"),newXElement("年齡","21"));xDoc.Add(xel);xDoc.Save(s);}【例10.29】本例刪除編號為001的學(xué)生。修改例12.28,Button控件屬性Text="刪除編號為003學(xué)生",其事件函數(shù)如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XElementxDoc=XElement.Load("e10_28.xml");varAllName=fromaNameinxDoc.Descendants("學(xué)生")where(string)aName.Attribute("編號")=="003"selectaName;foreach(varnameinAllName)name.RemoveAll();xDoc.Save("e10_29.xml");}【例10.30】本例修改編號為001的學(xué)生的年齡。修改上例,Button控件屬性Text="修改學(xué)生的年齡",其事件函數(shù)如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XElementxDoc=XElement.Load("e10_27.xml");varAllName=fromaNameinxDoc.Descendants("學(xué)生")where(string)aName.Attribute("編號")=="001"selectaName;foreach(varnameinAllName)name.Element("年齡").Value="18";xDoc.Save("e10_30.xml");}10.5XML架構(gòu)XML文件可用DTD(DocumentTypeDefine,文檔類型定義)和XSD(XMLSchema,XML架構(gòu))來描述其數(shù)據(jù)結(jié)構(gòu)。10.5.1DTD或XMLSchema定義XML架構(gòu)

DTD(DocumentTypeDefinition文檔類型定義)是SGML語言的組成部分,可以用來定義XML文檔的數(shù)據(jù)結(jié)構(gòu)和組成的元素類型,可以看作一個或多個XML文檔的模板。使用DTD可以對一個XML文檔的結(jié)構(gòu)進行校驗。它可以是一個獨立文件,也可以直接放在XML文檔中。例如,例10.1中的XML文件e10_1.xml的DTD文件如下:<!DOCTYPE學(xué)生列表[<!ELEMENT學(xué)生列表(學(xué)生)><!ELEMENT學(xué)生(姓名,性別,年齡)><!ATTLIST學(xué)生編號CDATA#REQUIRED><!ELEMENT姓名(#PCDATA)><!ELEMENT性別(#PCDATA)><!ELEMENT年齡(#PCDATA)>]>10.5.2用XMLSchema驗證XML架構(gòu)一個XML文檔首先應(yīng)當(dāng)是格式良好的,為了驗證格式的正確性,可以使用XMLSchema(XML架構(gòu),XSD)對一個XML文檔進行驗證?!纠?0.31】用VS2008打開e10_1.xml,選擇主菜單"XML(X)|創(chuàng)建架構(gòu)(C)"菜單項,為XML文件e10_1.xml建立架構(gòu)文件

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論