版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章可扩展标记语言学习目的掌握XML可扩展标记语言的基本概念和使用。能够建立、显示和处理XML文档数据能够对XML数据和数据库数据进行转换主要内容10.1XML基本概念10.2XML文档显示10.3查询XML文档10.4编辑XML文档10.5XML架构10.6数据库和XML
10.1XML基本概念XML是基于文本的标记语言,它通过有意义的标签以结构化的格式存储数据,能够描述矢量图形、数学公式、化学符号等数据,这种格式可以被任何一种计算机系统所解释。XML描述数据的另一优点是数据和显示数据的格式分离。10.1.1SGML(标准通用标记语言)SGML(StandardGeneralizedMarkupLanguage)是一种通用的文档结构描述标记语言,为文档数据的标记提供了异常强大的工具,同时具有极好的扩展性,因此在数据分类和索引中非常有用。但SGML复杂度太高,不适合网络的日常应用,加上开发成本高、不被主流浏览器所支持等原因,使得SGML推广受到阻碍。10.1.2XML(可扩展标记语言)XML(eXtensibleMarkupLanguage)是由W3C于1998年2月发布的标准,它是SGML的一个简化子集,它具有SGML的丰富功能,同时易于使用。XML优点如下:XML简单易用,功能强大。XML允许各个组织、个人建立适合自己需要的标记集合,并且这些标记可以用通用的工具显示。XML的最大优点在于它的数据存储格式不受显示格式的制约。通过有意义的标签以结构化的格式存储数据,用一种开放的自我描述方式定义数据结构。XML还有其他许多优点,比如它有利于不同系统之间的信息交流,完全可以充当网际语言,并有希望成为数据和文档交换的标准。10.1.3XML的文档格式首先介绍XML文档内容的基本单元——元素,它的语法格式如下:〈标签〉文本内容〈/标签〉元素是由起始标签、元素内容和结束标签组成。用户把要描述的数据对象放在起始标签和结束标签之间。例如:<姓名>王平</姓名>。无论文本内容有多长或者多么复杂,XML元素中可以再嵌套别的元素,这样使相关信息构成等级结构。用这样的方法定义XML文档数据和数据结构。【例10.1】下面的例子是一个描述学生情况的XML文档,用IE浏览器(5.0以上版本)浏览e10_1.xml文件,效果如图10.1。完整XML文件e10_1.xml内容如下:<?xmlversion="1.0"encoding="GB2312"?><学生列表><学生编号="001"><姓名>张三</姓名><性别>男</性别><年龄>20</年龄></学生><学生编号="002"><姓名>李四</姓名><性别>女</性别><年龄>19</年龄> </学生></学生列表>
XML文档中出现的有效对象是:声明:声明给XML解析器提供信息,使其能够正确解释文档内容,它的起始标识是"<?",结束标识是"?>"。注释:注释是XML文件中用作解释的字符数据,XML处理器不对它们进行任何处理。注释文本被"<!--"和"-->"标记,注释可以出现在XML元素间的任何地方,但是不可以嵌套。根元素和子元素:如果一个元素从文件头的序言部分之后开始,一直到文件尾,包含了文件中所有的数据信息,称为根元素。XML元素是可嵌套的,那么被嵌套在内的元素称为子元素。一个XML文档中有且仅有一个根元素,其他所有的元素都是它的子元素。属性:属性给元素提供进一步的说明信息,它必须出现在起始标签中。属性以名称/值成对出现,属性名不能重复,名称与取值之间用等号分隔,取值用引号括起来。XML文档的基本结构:XML文档的基本结构由序言部分和一个根元素组成。序言包括了XML声明和DTD或XSD声明,DTD(DocumentTypeDefine,文档类型定义)和XSD(XMLSchema,XML架构)都是用来描述XML文档的数据结构的(参见10.5节)。例如,在例10.1的XML文件e10_1.xml文档前面加上如下的序言部分,就构成了一个完整的XML文档:<?xmlversion="1.0"encoding="GB2312"?><!DOCTYPEstudentsSYSTEM"e10_1.dtd">格式良好的(Well-Formed)XML文档:一个XML文档首先应当是格式良好的,格式良好XML文档的正式定义位于:/TR/REC-xml。格式良好的XML文档除了要满足根元素惟一的特性之外,还包括:(1)起始标签和结束标签应当匹配,结束标签是必不可少的。(2)大小写应一致,XML对字母的大小写是敏感的,<employee>和<Employee>是完全不同的两个标签,所以结束标签在匹配时一定要注意大小写一致。(3)元素应当正确嵌套,子元素应当完全包括在父辈元素中,下面例子就是错误嵌套:<A><B></A></B>,正确的嵌套方式如下:<A><B></B></A>。(4)属性值必须包括在引号中,元素中的属性名是不允许重复的。10.1.4XPath表示XML文档路径XPath表达式说明例10.1中位置第一个元素为/绝对路径,从根节点开始/学生列表,<学生列表>元素其余/在路径中分割元素/学生列表/学生,从根开始的所有学生元素第一个元素为//相对路径,从指定元素开始//学生/姓名,所有学生姓名元素@元素名称属性//学生/@编号,所有学生编号*选择路径的任何元素//学生/*,所有学生的编号、姓名、性别和年龄@*所有属性/所有学生/@*,所有编号.当前元素..父元素如当前为学生元素,则指向学生列表元素[]筛选条件//学生[@编号='002'],编号为1的学生元素10.2XML文档显示XML文件可用IE浏览器显示,由于XML文档仅定义数据及其数据结构,并不包含显示格式,如不另定义显示格式,显示效果类似图10.1。如希望IE按指定格式显示这些数据,必须使用CSS文件或XSL文件定义显示格式。WPF应用程序可使用数据绑定方法显示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="学生列表/学生"><xsl:value-ofselect="@编号"/>,<xsl:value-ofselect="姓名"/>,<xsl:value-ofselect="性别"/>,<xsl:value-ofselect="年龄"/></xsl:for-each></xsl:template></xsl:stylesheet>【例10.3】html标记是用来描述网页的数据和显示格式。在xsl文件中可以使用html标记,上例中逗号和<br>标记都是html标记,另一个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="学生列表/学生">
<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文件转换为HTML文件【例10.4】本例将e10_3.xml文件,按照e10_3.xsl定义的显示格式生成HTML文件e10_4.htm。建立新项目,在window1.xaml.cs文件头部增加引用如下命名空间语句:usingSystem.Xml;usingSystem.Xml.Xsl;增加一个按钮,其事件函数如下。用浏览器IE显示e10_4.html效果和例12.3相同。privatevoidbutton1_Click(objectsender,RoutedEventArgse){XslCompiledTransformxslt=newXslCompiledTransform();xslt.Load(@"E:\应用程序设计教程(第二版)\Example\ch10\e10_4\XML文件转换为HTML文件\e10_3.xsl");xslt.Transform(@"E:\应用程序设计教程(第二版)\Example\ch10\e10_4\XML文件转换为HTML文件\e10_3.xml","e10_4.html");}10.2.3TreeView控件和Xml数据绑定【例10.5】本例使用ListView控件显示例e10_1的xml文档。创建新项目。单击"项目|添加现有项"菜单项,将e10_1.xml文件增加到项目中。用如下标记替换Window1.xaml文件中Grid标记。<Window.Resources><XmlDataProviderx:Key="e10_1XmlDoc"Source="E:\应用程序设计教程(第二版)\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=/学生列表/学生}"><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标记中定义XML文档,用ListView控件显示这个XML文档。 <StackPanelHeight="53"><StackPanel.Resources><XmlDataProviderx:Key="Students"><x:XData><所有学生xmlns=""><学生学号="001">张三</学生><学生学号="002">李四</学生><学生学号="003">王五</学生></所有学生></x:XData></XmlDataProvider></StackPanel.Resources><ListBoxWidth="87"Height="47"ItemsSource="{BindingSource={StaticResourceStudents},XPath=/所有学生/学生}"><ListBox.ItemTemplate><DataTemplate><StackPanelOrientation="Horizontal"><TextBlockText="{BindingXPath=@学号}"/><TextBlockText="{BindingXPath=.}"/></StackPanel></DataTemplate></ListBox.ItemTemplate></ListBox></StackPanel>【例10.7】本例使用TreeView控件显示学生学号和姓名。在Grid标记中填入如下标记。<TreeView><TreeViewItemHeader="所有学生"><TreeViewItemHeader="001">张三</TreeViewItem><TreeViewItemHeader="002">李四</TreeViewItem><TreeViewItemHeader="003">王五</TreeViewItem></TreeViewItem></TreeView>XML文档只有一个根元素,根元素中还可以嵌入子元素,子元素还可以有子元素,因此XML文档具有层次结构,因此也可以使用TreeView控件显示。为了显示XML文档,必须使用HierarchicalDataTemplate类为TreeView控件每一节点定义模板。【例10.8】本例说明如何将TreeView控件绑定到例10.1中的XML文档。标记如下: <StackPanelHeight="91"><StackPanel.Resources><HierarchicalDataTemplateDataType="所有学生"ItemsSource="{BindingXPath=*}"><TextBlockFontStyle="Italic"Text="所有学生"/></HierarchicalDataTemplate><HierarchicalDataTemplateDataType="学生"ItemsSource="{BindingXPath=*}"><TextBlockFontWeight="Bold"FontSize="14"Text="{BindingXPath=@学号}"/></HierarchicalDataTemplate><DataTemplateDataType="姓名"><TextBlockForeground="Blue"Text="{BindingXPath=.}"/></DataTemplate><XmlDataProviderx:Key="Students"XPath="所有学生"><x:XData>
<所有学生xmlns=""><学生学号="001"><姓名>张三</姓名></学生><学生学号="002"><姓名>李四</姓名></学生><学生学号="003"> <姓名>王五</姓名></学生></所有学生></x:XData></XmlDataProvider></StackPanel.Resources><TreeViewName="treeView1"ItemsSource="{BindingSource={StaticResourceStudents},XPath=.}"/></StackPanel>10.3查询XML文档查询XML文档是指读取或查找XML文档指定数据或标记。可使用XmlTextReader、XmlDocument、XPathNavigator和XDocument类实现查询。10.3.1XmlTextReader类查询XML
XmlTextReader类可以读取XML文件,但只提供非缓存的只进、只读访问。这意味着使用XmlTextReader无法编辑属性值或元素内容,也无法插入和移除节点。【例10.9】本例用来读出e10_1.xml文件中每个学生的姓名、性别和年龄等数据。使用XmlTextReader类读XML文档各种元素只能顺序读出。在Window1.xaml.cs文件头部增加引用命名空间语句:usingSystem.Xml;在Window1窗体放置ListBox控件,Name属性为listBox1,在Window1类构造函数最后增加如下语句。XmlTextReaderdr=newXmlTextReader("e10_1.xml"); //xml文件和可执行文件在同一目录while(dr.Read())if(dr.NodeType==XmlNodeType.Text)listBox1.Items.Add(dr.Value); XML文档的节点分为两大类,第一类是文本节点,即XML文档的数据。在两个标记之间的文本被称为一个文本节点。第二类是非数据节点,它又可以分为以下几大类:注释节点声明节点开始标记节点结束标记节点【例10.10】本例用来读出e10_1.xml文件学生标记的编号属性。修改上例代码如下:XmlTextReaderdr=newXmlTextReader("e10_1.xml");while(dr.Read())if(dr.NodeType==XmlNodeType.Element)//判断是否为开始标记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文档在内存中表示形式。DOM使程序员能够以编程方式读取、操作和修改XML文档。DOM的节点的概念和上节叙述的概念完全相同,因此也可以使用类似XmlTextReader类的方法读出XML文档的数据和非数据节点。下边仅给出读出XML文档的数据的例子,读XML文档中的非数据节点请读者完成。【例10.13】使用XML文档对象模型(DOM)读出e10_1.xml文件中每个学生的姓名、性别和年龄等数据。修改例10.9代码如下:XmlDocumentdoc=newXmlDocument();//创建XmlDocument类的实例doc.Load("e10_1.xml");//xml文件和可执行文件在同一目录。读XML文件到内存,形成DOM结构XmlNodeReaderdr=newXmlNodeReader(doc);while(dr.Read()) if(dr.NodeType==XmlNodeType.Text) listBox1.Items.Add(dr.Value);【例10.14】本例显示XML文件e10_1.xml的所有学生姓名。修改例10.9代码如下:XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml"); //下句得到XML文档中"姓名"节点放到节点数组中XmlNodeListelemList=doc.GetElementsByTagName("姓名");for(inti=0;i<elemList.Count;i++){listBox1.Items.Add(elemList[i].InnerXml);}【例10.15】本例用XPath语言查询实现例10.13相同功能,修改例10.9代码如下:XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml");XmlNodeListnodes=doc.SelectNodes("/学生列表/学生")//所有学生元素foreach(XmlNodenodeinnodes) //分别取出每个学生元素{for(inti=0;i<node.ChildNodes.Count;i++)//学生子元素有3个,是<姓名>、<性别>、<年龄>{//下条语句参数i=0的值是姓名的值,i=1的值是性别的值,i=2的值是年龄的值listBox1.Items.Add(node.ChildNodes[i].FirstChild.Value);}}【例10.16】本例用XPath语言查询实现例10.14相同功能,修改例10.9代码如下:
XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml");XmlNodeListnodes=doc.SelectNodes("//学生/姓名");foreach(XmlNodenodeinnodes) {listBox1.Items.Add(node.FirstChild.Value);}【例10.17】用XPath语言查询编号=002的学生姓名,修改例10.9代码如下:
XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml");//XmlNodenode=doc.SelectSingleNode("//学生[contains(@编号,'002')]"); //此句也正确
XmlNodenode=doc.SelectSingleNode("//学生[@编号='002']");listBox1.Items.Add(node.ChildNodes[0].FirstChild.Value);10.3.3XPathNavigator类查询XMLXPathNavigator类和XmlDocument类的工作方式类似,在内存中处理XML文档,允许移动节点,关键的区别是XPathNavigator采用游标方式,使用MoveToNext()之类的方法向前或向后移动节点。一般从XmlDocument类对象导出XPathNavigator类对象。【例10.18】用XPathNavigator类读出e10_1.xml文件中每个学生的编号、姓名、性别和年龄等数据。修改例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构造函数中代码,增加代码如下:
XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml");XPathNavigatorxnav=doc.CreateNavigator();getAllText(xnav);10.3.4XDocument和LINQtoXML为了实现LINQtoXML,.Net3.5引入了System.Xml.Linq命名空间,在该命名空间中,引入了若干类用来操作XML文档,包括用XDocument类代表整个XML文档,用XElement类代表XML文档中某个元素,用XAttribute类代表XML文档节点属性,用XComment类代表XML文档注释,用XDeclaration类代表XML文档声明,用XName类代表XML命名空间。使用这些类,采用不同于XMLDocument类的方式,能够更快捷方便地操作XML文档,下边用例子说明LINQtoXML用法。【例10.19】本例查找e10_1.xml所有学生的姓名。修改例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的学生姓名,上例LINQ语句修改如下:varAllName=fromaNameinxDoc.Descendants("学生")where(string)aName.Attribute("编号")=="001"selectaName.Element("姓名").Value;【例10.21】如果查找e12_18.xml所有女学生的姓名,上例LINQ语句修改如下:varAllName=fromaNameinxDoc.Descendants("学生")where(string)aName.Element("性别")=="女"selectaName.Element("姓名").Value;10.4编辑XML文档10.4.1XmlTextWriter类写XML文档
XmlTextWriter类提供了快速、非缓存、只进方法生成XML文档的方法,可以生成包含XML数据的流或文件。该类属性Formatting为Formatting.None,表示不使用特殊的格式设置XML文档,这是默认选项;如果为Formatting.Indented,表示使子元素根据Indentation和IndentChar设置缩进。【例10.22】本例用XmlTextWriter类生成一个XML文档,建立新项目,增加引用命名空间语句:usingSystem.Xml;在窗体增加一个按钮,按纽单击事件函数如下: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("学生"); writer.WriteAttributeString("编号","001");writer.WriteElementString("姓名","张三"); writer.WriteElementString("性别","男");writer.WriteElementString("年龄","20");writer.WriteEndElement(); writer.Close();}用程序写出的XML文档的书局格式如下:<学生编号="001"> <姓名>张三</姓名> <性别>男</性别> <年龄>20</年龄></学生>10.4.2XmlDocument类编辑XML文档
XmlDocument类使程序员能够以编程方式创建、编辑和删除XML文档内容。【例10.23】用XmlDocument类创建一个XML文档。修改例10.22按钮事件函数如下: 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创建的e10_23.xml文件增加一个新节点。修改例10.22,首先将e10_23.xml文件拷贝到生成的可执行文件所在文件夹,修改例10.22按钮事件函数如下: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创建的e10_23.xml文件增加一个新属性。修改例10.24,首先将e10_23.xml文件拷贝到生成的可执行文件所在文件加,修改例10.24按钮事件函数如下: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文档指定节点,修改该节点数据。修改例10.24,首先将e10_1.xml文件拷贝到生成的可执行文件所在文件加,修改例10.24按钮事件函数如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XmlDocumentdoc=newXmlDocument();doc.Load("e10_1.xml"); XmlNodestudent;XmlNoderoot=doc.DocumentElement; student=root.SelectSingleNode("descendant::学生[姓名='张三']");student["年龄"].InnerText="22";doc.Save("e10_26.xml");}10.4.3XDocument编辑XML文档【例10.27】本例用语句生成和XML文件e10_1.xml相同的XML文件e10_27.xml。创建新项目,增加如下命名空间:usingSystem.Xml;usingSystem.Xml.Linq;放置Button控件到窗体,其属性Content="用程序写XML文件",其事件函数如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XDocumentxDoc=newXDocument(newXDeclaration("1.0","GB2312","yes"),newXComment("这是一个注释"),newXElement("学生列表",
newXElement("学生",newXAttribute("编号","001"),newXElement("姓名","张三"),newXElement("性别","男"),newXElement("年龄","20")),newXElement("学生",newXAttribute("编号","002"),newXElement("姓名","李四"),newXElement("性别","女"),newXElement("年龄","19"))));xDoc.Save("e10_27.xml");}编译运行后,单击按钮,创建XML文件e10_27.xml,可用IE浏览器查看该文件。【例10.28】本例为XML文件e10_27.xml增加一个学生节点。修改上例,修改按纽控件标题为"增加学生节点",其事件函数如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XElementxDoc=XElement.Load("e10_27.xml"); //该文件必须和可执行文件在同一文件夹XElementxel=newXElement("学生",newXAttribute("编号","003"),newXElement("姓名","王五"),newXElement("性别","女"),newXElement("年龄","21"));xDoc.Add(xel);xDoc.Save(s);}【例10.29】本例删除编号为001的学生。修改例12.28,Button控件属性Text="删除编号为003学生",其事件函数如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XElementxDoc=XElement.Load("e10_28.xml");varAllName=fromaNameinxDoc.Descendants("学生")where(string)aName.Attribute("编号")=="003"selectaName;foreach(varnameinAllName)name.RemoveAll();xDoc.Save("e10_29.xml");}【例10.30】本例修改编号为001的学生的年龄。修改上例,Button控件属性Text="修改学生的年龄",其事件函数如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){XElementxDoc=XElement.Load("e10_27.xml");varAllName=fromaNameinxDoc.Descendants("学生")where(string)aName.Attribute("编号")=="001"selectaName;foreach(varnameinAllName)name.Element("年龄").Value="18";xDoc.Save("e10_30.xml");}10.5XML架构XML文件可用DTD(DocumentTypeDefine,文档类型定义)和XSD(XMLSchema,XML架构)来描述其数据结构。10.5.1DTD或XMLSchema定义XML架构
DTD(DocumentTypeDefinition文档类型定义)是SGML语言的组成部分,可以用来定义XML文档的数据结构和组成的元素类型,可以看作一个或多个XML文档的模板。使用DTD可以对一个XML文档的结构进行校验。它可以是一个独立文件,也可以直接放在XML文档中。例如,例10.1中的XML文件e10_1.xml的DTD文件如下:<!DOCTYPE学生列表[<!ELEMENT学生列表(学生)><!ELEMENT学生(姓名,性别,年龄)><!ATTLIST学生编号CDATA#REQUIRED><!ELEMENT姓名(#PCDATA)><!ELEMENT性别(#PCDATA)><!ELEMENT年龄(#PCDATA)>]>10.5.2用XMLSchema验证XML架构一个XML文档首先应当是格式良好的,为了验证格式的正确性,可以使用XMLSchema(XML架构,XSD)对一个XML文档进行验证。【例10.31】用VS2008打开e10_1.xml,选择主菜单"XML(X)|创建架构(C)"菜单项,为XML文件e10_1.xml建立架构文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度公寓装修与智能家居集成合同2篇
- 大学生职业生涯规划大赛
- 全国山西经济版小学信息技术第二册第一单元活动10《图文并茂练排版》说课稿
- 山东省泰安市新泰市2024-2025学年四年级上学期期末质量检测数学试题参考答案
- 8000吨二甲基二硫醚生产项目可行性研究报告模板-立项备案
- 湖北省十堰市城区2024-2025学年四年级上学期期末数学试题参考答案
- 浙江省杭州市(2024年-2025年小学六年级语文)部编版能力评测(下学期)试卷及答案
- 2024年事业单位教师招聘言语理解与表达题库附答案
- Unit2 Special Days Lesson 3(说课稿)-2023-2024学年人教新起点版英语五年级下册
- 贵州盛华职业学院《近代建筑引论》2023-2024学年第一学期期末试卷
- GB/T 19326-2022锻制支管座
- GB/T 9740-2008化学试剂蒸发残渣测定通用方法
- GB/T 7424.1-1998光缆第1部分:总规范
- 拘留所教育课件02
- 护士事业单位工作人员年度考核登记表
- 儿童营养性疾病管理登记表格模板及专案表格模板
- 天津市新版就业、劳动合同登记名册
- 数学分析知识点的总结
- 2023年重症医学科护理工作计划
- 年会抽奖券可编辑模板
- 感染性疾病标志物及快速诊断课件(PPT 134页)
评论
0/150
提交评论