XML基础教程第10章 XML在C#中的典型应用
- 格式:ppt
- 大小:395.50 KB
- 文档页数:27
C++中的XML和JSON处理在C++中,XML和JSON是两种常用的数据格式,可以用来存储和传输结构化数据。
XML(可扩展标记语言)是一种标记语言,而JSON (JavaScript对象表示)是一种数据交换格式。
它们都具有易读、易解析的特性,被广泛应用于网络通信、配置文件、数据存储等方面。
首先我们来看一下XML在C++中的处理。
C++有一些开源的XML库可以用来解析和生成XML数据,其中较为常用的有Xerces-C++、TinyXML、RapidXML等。
这些库提供了丰富的API和功能,可以方便地读取、修改和生成XML文档。
Xerces-C++是一个功能强大的XML解析库,支持DOM(文档对象模型)和SAX(简单API for XML)两种解析方式。
DOM方式以树状结构表示XML文档,允许很方便地遍历和修改XML数据;而SAX方式则是一种事件驱动的解析方式,逐行解析XML文档,适用于大型XML文档的处理。
Xerces-C++还提供了一些辅助函数用于生成XML文档,并且支持XPath等高级查询语言。
TinyXML是一个轻量级的XML解析库,简单易用。
它使用C++的对象模型来表示XML文档,可以方便地读取和修改XML数据。
TinyXML没有SAX解析方式,但提供了较为简单的DOM接口,适用于小型XML文档的处理。
TinyXML还支持XPath查询,方便地对XML文档进行高级查询操作。
RapidXML同样是一个轻量级的XML解析库,性能优异。
它使用模板技术来实现解析功能,具有较高的解析速度和低的内存占用。
RapidXML使用指针和迭代器来遍历XML文档,适用于大型XML文档的处理。
不过,相较于Xerces-C++和TinyXML,RapidXML的API相对简单,不支持DOM方式和XPath查询。
接下来我们来看一下JSON在C++中的处理。
C++同样有一些开源的JSON库可以用来解析和生成JSON数据,其中比较常用的有RapidJSON、JSON for Modern C++、nlohmann/json等。
也是一个元素,元素除了包含元素还可以包含文本信息。
元素也可以含有属性,比如property就具有name属性。
XML 元素可以在开始标签中包含属性,属性 (Attribute) 提供关于元素的额外(附加)信息。
属性通常提供不属于数据组成部分的信息,但是对需要处理这个元素的应用程序来说却很重要。
XML 属性必须加引号,属性值必须被引号包围,不过单引号和双引号均可使用。
如果属性值本身包含双引号,那么有必要使用单引号包围它,或者可以使用实体引用。
1.2.3. 大小写敏感XML对大小写是敏感的,这一点不象HTML。
在XML中,标记< Letter> 和标记 <letter> 是不一样的。
因此,打开和结束标记的大小写应该写成相同的:1.2.4. 元素必须有关闭标签XML要求每个元素必须由起始标签和关闭标签组成。
关闭标签与起始标签的名字相同,写法上多一个“/”例如:<Letter> 只有起始标记是不行的。
<Letter></Letter> 必须要有关闭标签1.2.5. 必须有根元素XML要求必须有根元素,所谓根元素就是不被其它元素包围(不含有父元素)。
并且根元素只能有一个。
01.<d a t a s o u r c e i d ="d b _o r a c l e "> 02.…03. </d a t a s o u r c e >01.<l e t t e r >…</l e t t e r >02. <L e t t e r >…</L e t t e r >01.<d a t a s o u r c e i d =“d b _o r a c l e ”> 根元素 02.<p r o p e r t y n a m e ="u r l ">03.j d b c :t h i n @192.168.0.26:1521:t a r e n a 04.</p r o p e r t y >05.<p r o p e r t y n a m e ="d b U s e r ">o p e n l a b </p r o p e r t y >06. <p r o p e r t y n a m e ="d b P w d ">o p e n 123</p r o p e r t y >07.</d a t a s o u r c e>08.这里不能再定义与d a t a s o u r c e平级的元素!1.2.6. 元素必须正确嵌套XML要求所有元素必须正确的嵌套。
XML(Extensible Markup Language)是一种元标记语言,可以用来描述数据。
XML提供了一种标准化的方式,使程序和应用程序可以有效地共享数据,而不受数据类型和平台的限制。
XML的语法包括文档格式、元素、属性和实体等。
一、XML文档格式XML文档是一个标记文档,包含一个XML声明,一个根元素和其他元素。
XML声明用来声明文档的版本号、编码方式和其他信息。
根元素是文档的起始点,它可以包含其他元素和属性。
其他元素是根元素的子元素,可以包含其他元素和属性。
属性是元素的附加信息,可以用来描述元素的语义。
二、XML元素XML元素是文档的基本单位,用来描述数据。
元素可以包含子元素,也可以包含属性。
元素的起始标签和结束标签之间的内容是元素的内容。
元素的内容可以是文本、其他元素、属性或实体。
三、XML属性XML属性是元素的附加信息,可以用来描述元素的语义。
属性的值可以是字符串、数值、日期或其他类型的数据。
属性的名字应该使用驼峰命名法,即首字母小写,其余字母大写。
属性的值应该使用双引号括起来,以区分属性的名字和值。
四、XML实体XML实体是一个名称,可以用来表示一个完整的文本或其他数据。
实体可以用来替换XML中的文本或其他数据,以提高XML文档的可读性和可维护性。
五、XML语法错误XML文档的语法错误可能会导致XML解析器无法解析文档。
常见的XML语法错误包括:1. 缺少元素或属性的起始标签或结束标签。
2. 元素或属性的名字错误,或者名字不符合驼峰命名法。
3. 元素或属性的值不符合XML的语法规则,例如字符串值缺少引号或实体值缺少引号。
4. 属性的名字与元素的名字相同。
5. 文档格式不正确,例如缺少XML声明或根元素。
六、XML文档解析XML文档可以使用XML解析器解析,以获取文档的内容。
XML解析器可以使用SAX(Simple API for XML)或DOM(Document Object Model)等方式解析文档。
XML从⼊门到深⼊(超详细)⼀:什么是XML XML (eXtensible Markup Language)指可扩展标记语⾔,标准通⽤标记语⾔的⼦集,简称XML。
是⼀种⽤于标记电⼦⽂件使其具有结构性的标记语⾔。
XML可以标记数据、定义数据类型,可以允许⽤户对⾃⼰标记语⾔进⾏⾃定义,是对⼈和机器都⽐较友好的数据承载⽅式;XML其前⾝是SGML(标准通⽤标记语⾔)。
传统的系统已经远远不⾜以来表达复杂的信息,简单的语⾔根本⽆法表达出⼀些细微的差别,需要更完整的语⾔来表达⽹络世界⾥⽇益丰富复杂的信息内涵 XML - 可扩展标记语⾔便由此诞⽣,它不像HTML追求美观的效果,⽽不重视实际交流应⽤现象,所以XML语⾔的出现核⼼是⽤来展⽰及数据的交互,它的出现把⽹络表达的语⾔集合推进了⼀⼤步,XML传递信息,具有跨平台的特性(如:WebService)它作为数据交互和⽹络计算基础,尤其是在电⼦商务应⽤上的出⾊表现,现在已经没⼈怀疑它给信息社会带来的⾰命性影响(随着2021的到来JSON也是⼀个不错的选择)<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><Students><Student><name>蚂蚁⼩哥</name><address>安徽六安</address></Student><Student><name>欧阳康康</name><address>安徽六安</address></Student></Students>1:编写XML注意事项①:XML 中的每个元素都是成对出现的,有开始和结束,⾃闭和标签除外,但是都得有 '/'结束标志如:<student>xxxxx</student> ⾃闭和:<student name='xxx' />②:每个XML⽂档都有且只有⼀个根元素(Root Element)③:XML标签对⼤⼩写敏感④:XML必须正确嵌套⑤:同级标签以所缩进对齐⑥:元素名称可以包含字母,数字,但不能以数字开头⑦:元素名称中不能含有空格或者 ' : '号⑧:如出现特殊字符需要转义如:<,>,",',&....2:使⽤XML的优缺点优点:①:XML是使⽤信息⾃描述的新语⾔(没有约束的情况下)②:信息共享(⾃定义数据格式,⽽且很容易使⽤⼯具读写)③:数据传递(⽀持各种通道传递数据,如WebService就使⽤XML传输数据)④:数据重⽤、分离数据和显⽰、⽂档包含语义、⽅便阅读有⾯向对象的树形结构缺点:①:数据量⼤是传输效果不好,因为XML定义了和数据⽆关的标签3:XML基本语法第⼀⾏必须是XML的声明<?xml ?>version:xml的版本,必须设定,当前只有'1.0'版本encoding:当前xml⾥⾯的数据格式,默认UTF-8standalone:标记是否是⼀个独⽴的xml,默认yes如果设置 no 表⽰这个XML不是独⽴的⽽是依赖于外部的DTD约束⽂件(后⾯说)<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><Students><Student><name>蚂蚁⼩哥</name><address>安徽六安</address></Student></Students>⼆:XML专⽤标记 XML其实是有专⽤的标记,也可以理解是XML的基本语法,但是这些语法你在看HTML语法时也看到过,因它们都属于⼀个⼤家族,只是应⽤的⽅向不⼀样⽽导致的差异有部分不⼀样1:XML注释 语法:<!-- 这是⼀个注释 --><?xml version="1.0" encoding="UTF-8" standalone="yes" ?><School><!--定义学⽣对象这是⼀个注释--><Student id="st01" name="张三" age="23"/></School>①:注释⾥的内容不要出现 --②:不要把注释写在元素中间如<Student <!--这⾥注释报错--> ></Student>③:注释不可嵌套2:XML处理PI指令 其实XML⾥的PI指令⼤家可以理解为XML设置样式的,但是考虑到XML是⽤于存储数据的载体,所以这个指令⽤的也不多 语法:<?⽬标指令?> 如引⼊CSS样式:<?xml-stylesheet type='css类型' href='引⼊css样式地址'> CSS类型可以设置 type='text/css' type='text/xsl'<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!--引⼊PI指令注意只能放在头部并引⼊style.css样式--><?xml-stylesheet type='text/css' href='./style.css' ?><School><!--定义学⽣对象这是⼀个注释--><Student><name>蚂蚁⼩哥</name></Student></School><!--CSS样式-->name {font: normal 500 22px "微软雅⿊";color:#f69;}3:XML之CDATA节 ⽤于把整段⽂本解析为纯字符串数据⽽不是标记的情况,其实包含在CDATA节中的特殊字符<、>、&都会当作字符展⽰<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><School><!--定义学⽣对象这是⼀个注释--><Student><!--使⽤<![CDATA[xxx]]>可以把特殊字符当作⽂本--><name><![CDATA[我是⼀个"⽂本":想不到把]]></name></Student></School> 那么问题来的,如果我不使⽤CDATA节包裹的话在⽂本区域输⼊<,>等就会和关键字符冲突,我们需要使⽤转义<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><School><!--定义学⽣对象这是⼀个注释--><Student><!--这⾥的蚂蚁⼩< > 哥报错 <>⼲扰,我们要使⽤转义--><!--<name>蚂蚁⼩<>哥</name>--><name>蚂蚁⼩<>哥</name></Student></School><!--常⽤⽹页转义字符 xml也可以使⽤--><!--显⽰结果描述实体名称实体编号空格  < ⼩于号 < <> ⼤于号 > >& 和号 & &" 引号 " "' 撇号 '(IE不⽀持) '¢分 ¢ ¢£ 镑 £ £¥ ⽇圆 ¥ ¥§ 节 § §© 版权 © ©® 注册商标 ® ®× 乘号 × ×÷ 除号 ÷ ÷-->XML中转义字符的使⽤三:核⼼DTD语法约束1:什么是DTD,为什么使⽤DTD DTD是⽂档类型定义(Document Type Definiyion),它是⽤来描述XML⽂档结构,⼀个DTD⽂档会包含如下内容:元素(ELEMENT):的定义规则,描述元素之间的关系规则属性(ATTLIST):的定义规则,可以定义具体的标签内部属性为什么使⽤DTD:①:DTD⽂档与XML⽂档实例关系如类与对象关系②:有了DTD,每个XML⽂件可以携带⼀个⾃⾝格式描述③:有了DTD,不同组织的⼈可以使⽤⼀个通⽤DTD来交换数据④:应⽤程序可以使⽤⼀个标准的DTD校验从外部世界接受来的XML是否是⼀个有效标准XML⑤:可以使⽤DTD校验⾃⼰的XML数据2:DTD定义⽂档规则(DOCTYPE)DTD⽂档的声明及引⽤有三种:内部DTD⽂档:<!DOCTYPE 根元素[定义元素属性等等内容]>外部DTD⽂档:<!DOCTYPE 根元素 SYSTEM 'DTD⽂件路径'>内外部DTD⽂档结合:<!DOCTYPE 根元素 SYSTEM 'DTD⽂件路径'[定义元素属性等等内容]><?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!--注:此时我这⾥⾯的 ELEMENT 定义元素的我后⾯介绍--><!DOCTYPE Student[<!ELEMENT Student (name)><!ELEMENT name (#PCDATA)>]><Student><name>蚂蚁⼩哥</name></Student>内部定义DTD⽂档<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!DOCTYPE Student SYSTEM './st.dtd'><Student><name>蚂蚁⼩哥</name></Student><!--下⾯是⽂件 st.dtd--><!DOCTYPE Student[<!ELEMENT Student (name)><!ELEMENT name (#PCDATA)>]>外部定义DTD⽂档<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!DOCTYPE Student SYSTEM './st.dtd'[<!ELEMENT Student (name,age,sex)><!ELEMENT sex (#PCDATA)>]><Student><name>蚂蚁⼩哥</name><age>23</age><sex>男</sex></Student><!--外部引⽤的st.dtd⽂件--><?xml version="1.0" encoding="UTF-8" ?><!--这⾥不能写DOCTYPE,因为这个可以当作元素引⽤,具体规则在上⾯定义--><!ELEMENT name (#PCDATA)><!ELEMENT age (#PCDATA)>内外部定义DTD⽂档3:DTD元素的定义(ELEMENT)语法:<!ELEMENT 元素名称(NAME) 元素类型(COUTENT)>注:ELEMENT关键字元素名称:就是⾃定义的⼦标签名称元素类型:EMPTY:该元素不能包含⼦元素和⽂本,但是可以有属性,这类元素称为⾃闭和标签ANY:该元素可以包含任意在DTD中定义的元素内容#PCDATA:可以包含任何字符数据,设置这个就不能包含⼦元素了,⼀般设置具体value混合元素类型:只包含⼦元素,并且这些⼦元素没有⽂本混合类型:包含⼦元素和⽂本数据混合体<!-- 定义空元素EMPTY --><?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!DOCTYPE Student[<!ELEMENT Student EMPTY>]><!--约束为空元素所以写成⾃闭和标签,--><Student/><!-- 定义组合元素(student,teacher)并为每个元素设置类型(#PCDATA) --><?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!DOCTYPE School[<!ELEMENT School (student,teacher)><!ELEMENT student (#PCDATA)><!ELEMENT teacher (#PCDATA)>]><School><student>我是学⽣</student><teacher>我是⽼师</teacher></School><!-- 设置任意元素ANY 虽然student元素内部没有再设置元素⽽设置ANY,那我就可以在编写任意⼦元素,前提在⾥⾯有定义 --><?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!DOCTYPE School[<!ELEMENT School (student)><!ELEMENT student ANY><!ELEMENT name (#PCDATA)><!ELEMENT address (#PCDATA)>]><School><student><name>蚂蚁⼩哥</name><address>安徽六安</address></student></School><!-- 元素组合及混合,可以使⽤通配符 --><?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!DOCTYPE School[<!ELEMENT School (student*,teacher?)><!ELEMENT student (#PCDATA)><!ELEMENT teacher (#PCDATA)>]><School><student>我是学⽣A</student><student>我是学⽣B</student></School>DTD元素定义具体代码通配符:() ⽤来元素分组如:(a|b|c),(d,e),f 分三组| 在列表中选⼀个如(a|b)只能选⼀个表⽰a|b必须出现并⼆选⼀+ 该对象⾄少出现⼀次或多次如(a+) 该元素可以出现多次* 该对象允许出现0次到多次如(a*) 该元素可以不出现或出现多次表⽰可出现⼀次或者不出现(a?) a可以出现,或者不出现, 常⽤按照顺序出现(a,b,c) 表⽰依次a,b,c4:DTD属性的定义(ATTLIST)语法:<!ATTLIST 元素名称属性名称类型属性特点>元素名称:我们⾃定义的元素名称属性类型:我们为元素上添加⾃定义属性类型:CDATA:任意字符(理解为任意字符的字符串)ID:以字母开头唯⼀值字符串,IDREF/IDREFS:可以指向⽂档中其它地⽅声明的ID类型值(设置此值是可以在⽂档上存在的)使⽤IDREFS时可以使⽤空格隔开NMTOKEN/NMTOKENS:NMTOKEN是CDATA的⼀个⼦集,设置该属性时只能写英⽂字母、数字、句号、破折号下划线、冒号,但是属性值⾥⾯不能有空格 NMTOKENS:它是复数,如果设置多个值由空格隔开 Enumerated: 事先定义好⼀些值,属性的值必须在所列出的值范围内属性特点:#REQUIRED表⽰必须设置此属性#IMPLIED表⽰此属性可写可不写#FIXED value表⽰元素实例中该属性的值必须是指定的固定值#Default value为属性提供⼀个默认值<!-- 第⼀种写法 --><?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!DOCTYPE School[<!ELEMENT School (student*)><!ELEMENT student EMPTY><!--定义了⼀个id属性类型为ID 必须值--><!ATTLIST student id ID #REQUIRED><!--设置了name属性为任意字符的字符串必须值--><!ATTLIST student name CDATA #REQUIRED ><!--设置address 类型为多个常规字符串且不需要⼀定存在此属性--><!ATTLIST student address NMTOKENS #IMPLIED><!--设置srcID 该属性的值只能从id上⾯上取--><!ATTLIST student srcID IDREFS #IMPLIED>]><School><student id="st001" name="蚂蚁⼩哥"/><student id="st002" name="欧阳;*)*^%$:⼩⼩" address="安徽_六安安徽_合肥"/><student id="st003" name="许龄⽉" srcID="st001 st002"/></School><!-- 第⼆种写法 --><?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!DOCTYPE School[<!ELEMENT School (student*)><!ELEMENT student EMPTY><!--简便写法,全部放在⼀起写--><!--设置了name属性为任意字符的字符串不⼀定要设置此属性,但是设置必须按照指定的值--> <!ATTLIST studentid ID #REQUIREDname CDATA #FIXED '我们名字都⼀样'address CDATA '默认都是安徽'sex (男|⼥) #REQUIRED>]><School><student id="st001" sex="男" name="我们名字都⼀样"/><student id="st002" sex="⼥"/><student id="st003" sex="男" name="我们名字都⼀样"/></School>DTD的属性定义具体代码5:DTD实体定义(ENTITY)实体分类:普通内部实体,普通外部实体,内部参数实体,外部参数实体语法:普通内部实体定义:<!ENTITY 实体名 "实体值">普通外部实体引⼊:<!ENTITY 实体名 SYSTEM "URI/URL">内部参数实体定义:<!ENTITY % 实体名 "实体值">外部参数实体引⼊:<!ENTITY % 实体名 SYSTEM "URI/URL">⽰例定义:<!ENTITY name "蚂蚁⼩哥"><!ENTITY address "安徽六安">⽰例XML⾥使⽤:<name>&name;</name>使⽤范围:定义实体分为内部实体(定义在当前xml⽂件)和外部实体(定义在外部dtd⽂件⾥)<!-- 内部普通实体 --><?xml version="1.0" encoding="UTF-8" standalone="yes" ?><!DOCTYPE Student[<!ELEMENT Student (name,address)><!ELEMENT name (#PCDATA)><!ELEMENT address (#PCDATA)><!ENTITY name "蚂蚁⼩哥"><!ENTITY address "安徽六安">]><Student><name>&name;</name><address>&address;</address></Student>DTD实体定义代码6:使⽤命名空间(Namespace) 避免元素名冲突,使⽤URL作为XML的Namespaces(这样也有约束和提⽰好处) 语法:xmlns:[prefix]="URL" 元素和属性都可以应⽤命名空间 XML的元素名是不固定的,当两个不同类型的⽂档使⽤同样的名称描述两个不同类型的元素的时候就会出现命名冲突<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><h:table xmlns:h="/1999/xhtml"><h:tr><h:td>名称A</h:td><h:td>名称B</h:td></h:tr></h:table>四:核⼼Schema语法约束1:什么是XML Schema XML Schema描述了XML⽂档的结构。
C语⾔读写XML⽂档:libmxml库初学笔记(Mini-XML)使⽤XML存取数据很⽅便。
官⽹有详尽的英⽂⼿册,这⾥还找到了⼀份中⽂⼿册:这⾥只放⾃⼰学习时写的测试代码,有兴趣的同学可以做个参考。
#include<mxml.h>//创建xml⽂档//声明创建 xml树需要的 node节点mxml_node_t* xml; // xml格式标记mxml_node_t* keys_n; // 词汇库,unkey-词汇主键的⽗节点mxml_node_t* unikey_n; //⼀条词汇记录的基本单元,mark-词汇标签和 explain-词汇释义的⽗节点mxml_node_t* elem_n; //创建 mark explain 的节点//在内存中通过挂载node节点,构建 xml treexml=mxmlNewXML("1.0");//创建xml⽂档格式标记,必须,xml tree的根keys_n=mxmlNewElement(xml, "keys");//新节点,名为keys,挂载到 xmlunikey_n=mxmlNewElement(keys_n, "unikey");//新节点,名为unikey,挂载到 keysmxmlElementSetAttr(unikey_n, "word", "go alpha");//为unikey_n的节点设置属性:word="go alpha"elem_n=mxmlNewElement(unikey_n, "elem");//新节点,名为elem, 挂载到unikeymxmlElementSetAttr(elem_n, "element", "mark");//为elem_n的节点设置属性:element="mark"mxmlNewText(elem_n, 0, "AI");//为elem_n的节点新增⽂本,⽂本前的whitespace(空格)个数为0,内容为”AI”elem_n=mxmlNewElement(unikey_n, "elem");//新节点,名为elem, 挂载到unikeymxmlElementSetAttr(elem_n, "element", "explain");//为elem_n的节点设置属性:element="explain"mxmlNewText(elem_n, 0, "Google的AI程序");//为elem_n的节点新增⽂本,⽂本前的whitespace(空格)个数为0//将内存中创建的节点树写⼊⽂件FILE *fp = fopen("/Users/yaou/Area/tmp/xmltest-1.xml", "w");mxmlSaveFile(xml, fp, MXML_NO_CALLBACK);//关闭⽂件fclose(fp);//释放内存中的节点树mxmlDelete(xml);之后⼿动在新⽂件xmltext-1.xml ⾥添加⾥⼀些节点。
X M L基础教程课后习题解答(总8页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--XML基础教程课后习题习题一1.答:HTML是用来编写Web页的语言、不允许用户自定义标记,HTML体现数据的显示格式。
XML描述数据的组织结构、可自定义标记,其标记名称是对标记所包含的数据内容含义的抽象,而不是数据的显示格式。
2.答:使用UTF-8保存5.答:(1)不可以,(2)可以,(3)不可以6.答::time{ display:block;font-size:18pt;font-weight:bold}hour{ display:line;font-size:16pt;font-style:italic}mimute{ display:line;font-size:9pt;font-weight:bold}习题二1.答:(1)使用ANSI编码。
(2)可以。
(3)不合理。
2.答:不相同。
3.答:(1)和(2)。
4.答:。
5.答:“root”标记包含的文本内容都是空白字符。
“a1”标记包含的文本内容:<CCTV5>。
“a2”标记包含的文本内容: 子曰"有朋自远方来,不亦乐乎"。
习题三1.答:一个规范的XML文件如果和某个DTD文件相关联,并遵守该DTD文件规定的约束条件,就称之为有效的XML文件。
2.答:DTD文件的编码必须和其约束的XML文件的编码相一致。
3.答:无关。
4.答:(1) 使用SYSTEM文档类型声明的格式:<DOCTYPE 根标记的名称 SYSTEM "DTD文件的URI">(2) 使用PUBLIC文档类型声明的格式:<!DOCTYPE 根标记的名称 PUBLIC "正式公用标识符" "DTD文件的URI"> 5.答:一定。
6.答:(1)约束标记“张三”必须有“学号”属性(2)约束标记“张三”必须有“学号”属性,而且学号的属性值是固定的220123。
c解析xml常用方法解析XML是指将XML文档中的数据提取与分析的过程。
XML是一种标记语言,用于描述数据的结构与内容。
常用的XML解析方法包括DOM、SAX和StAX。
DOM解析:DOM(Document Object Model)是一种将XML文档表示为文档树的解析方法。
DOM解析将整个XML文档加载到内存中,并构建一个树形结构,可以方便地对XML文档进行遍历和操作。
常用的DOM解析类包括DocumentBuilder和Document类。
1.创建DOM解析器:```javaDocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(;DocumentBuilder builder = factory.newDocumentBuilder(;```2.加载XML文档:```javaDocument document = builder.parse(new File("file.xml")); //通过文件Document document = builder.parse(inputStream); //通过输入流Document document = builder.parse(url); //通过URL```3.获取根节点:```javaElement rootElement = document.getDocumentElement(;```4.遍历子节点:```javaNodeList nodeList = rootElement.getChildNodes(;for (int i = 0; i < nodeList.getLength(; i++)Node node = nodeList.item(i);if (node.getNodeType( == Node.ELEMENT_NODE)Element element = (Element) node;//处理子节点}```SAX解析:SAX(Simple API for XML)是一种基于事件驱动的解析方法。
xml格式讲解XML(eXtensible Markup Language)是一种用于描述和传输数据的标记语言。
它能够通过自定义标签来定义数据的结构和内容。
本文将对XML格式进行详细讲解。
一、XML的基本语法XML采用了类似于HTML的标签语法,但与HTML不同的是,XML标签必须自行定义,且对大小写敏感。
以下是XML的基本语法要点:1. 标签:XML使用尖括号(< >)来定义标签,标签通常成对出现,分为开始标签和结束标签。
例如:<book>...</book>2. 元素(Element):元素由开始标签、结束标签和标签内容组成。
例如:<name>John</name>3. 属性(Attribute):属性为元素提供更多的信息,通常出现在开始标签中。
例如:<book category="novel">...</book>4. 注释:注释用于添加对XML代码的说明,以"<!--"开头,以"-->"结尾。
例如:<!-- This is a comment -->二、XML的文档结构一个合法的XML文档必须包含一个根元素,并且所有的元素都必须严格嵌套。
以下是一个简单的XML文档示例:<?xml version="1.0" encoding="UTF-8"?><library><book><title>《Pride and Prejudice》</title><author>Jane Austen</author></book><book><title>《1984》</title><author>George Orwell</author></book></library>在上述示例中,根元素是"library",它包含了两个子元素"book",并且每个"book"元素分别包含了"title"和"author"元素。
c#操作xml⽂件using System.Xml;//初始化⼀个xml实例XmlDocument xml=new XmlDocument();//导⼊指定xml⽂件xml.Load(path);xml.Load(HttpContext.Current.Server.MapPath("~/file/bookstore.xml"));//指定⼀个节点XmlNode root=xml.SelectSingleNode("/root");//获取节点下所有直接⼦节点XmlNodeList childlist=root.ChildNodes;//判断该节点下是否有⼦节点root.HasChildNodes;//获取同名同级节点集合XmlNodeList nodelist=xml.SelectNodes("/Root/News");//⽣成⼀个新节点XmlElement node=xml.CreateElement("News");//将节点加到指定节点下,作为其⼦节点root.AppendChild(node);//将节点加到指定节点下某个⼦节点前root.InsertBefore(node,root.ChildeNodes[i]);//为指定节点的新建属性并赋值node.SetAttribute("id","11111");//为指定节点添加⼦节点root.AppendChild(node);//获取指定节点的指定属性值string id=node.Attributes["id"].Value;//获取指定节点中的⽂本string content=node.InnerText;//保存XML⽂件string path=Server.MapPath("~/file/bookstore.xml");xml.Save(path);//or use :xml.Save(HttpContext.Current.Server.MapPath("~/file/bookstore.xml"));⼆、具体实例在C#.net中如何操作XML需要添加的命名空间:using System.Xml;定义⼏个公共对象:XmlDocument xmldoc ;XmlNode xmlnode ;XmlElement xmlelem ;1,创建到服务器同名⽬录下的xml⽂件:⽅法⼀:xmldoc = new XmlDocument ( ) ;//加⼊XML的声明段落,<?xml version="1.0" encoding="gb2312"?>XmlDeclaration xmldecl;xmldecl = xmldoc.CreateXmlDeclaration("1.0","gb2312",null);xmldoc.AppendChild ( xmldecl);//加⼊⼀个根元素xmlelem = xmldoc.CreateElement ( "", "Employees", "") ;xmldoc.AppendChild ( xmlelem ) ;//加⼊另外⼀个元素for(int i=1;i<3;i++){XmlNode root=xmldoc.SelectSingleNode("Employees");//查找<Employees> XmlElement xe1=xmldoc.CreateElement("Node");//创建⼀个<Node>节点xe1.SetAttribute("genre","李赞红");//设置该节点genre属性xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性XmlElement xesub1=xmldoc.CreateElement("title");xesub1.InnerText="CS从⼊门到精通";//设置⽂本节点xe1.AppendChild(xesub1);//添加到<Node>节点中XmlElement xesub2=xmldoc.CreateElement("author");xesub2.InnerText="候捷";xe1.AppendChild(xesub2);XmlElement xesub3=xmldoc.CreateElement("price");xesub3.InnerText="58.3";xe1.AppendChild(xesub3);root.AppendChild(xe1);//添加到<Employees>节点中}//保存创建好的XML⽂档xmldoc.Save ( Server.MapPath("data.xml") ) ;//////////////////////////////////////////////////////////////////////////////////////结果:在同名⽬录下⽣成了名为data.xml的⽂件,内容如下,<?xml version="1.0"encoding="gb2312"?><Employees><Node genre="李赞红"ISBN="2-3631-4"><title>CS从⼊门到精通</title><author>候捷</author><price>58.3</price></Node><Node genre="李赞红"ISBN="2-3631-4"><title>CS从⼊门到精通</title><author>候捷</author><price>58.3</price></Node></Employees>⽅法⼆:XmlTextWriter xmlWriter;string strFilename = Server.MapPath("data1.xml") ;xmlWriter = new XmlTextWriter(strFilename,Encoding.Default);//创建⼀个xml⽂档 xmlWriter.Formatting = Formatting.Indented;xmlWriter.WriteStartDocument();xmlWriter.WriteStartElement("Employees");xmlWriter.WriteStartElement("Node");xmlWriter.WriteAttributeString("genre","李赞红");xmlWriter.WriteAttributeString("ISBN","2-3631-4");xmlWriter.WriteStartElement("title");xmlWriter.WriteString("CS从⼊门到精通");xmlWriter.WriteEndElement();xmlWriter.WriteStartElement("author");xmlWriter.WriteString("候捷");xmlWriter.WriteEndElement();xmlWriter.WriteStartElement("price");xmlWriter.WriteString("58.3");xmlWriter.WriteEndElement();xmlWriter.WriteEndElement();xmlWriter.Close();//////////////////////////////////////////////////////////////////////////////////////结果:<?xml version="1.0"encoding="gb2312"?><Employees><Node genre="李赞红"ISBN="2-3631-4"><title>CS从⼊门到精通</title><author>候捷</author><price>58.3</price></Node></Employees>2,添加⼀个结点:XmlDocument xmlDoc=new XmlDocument();xmlDoc.Load(Server.MapPath("data.xml"));XmlNode root=xmlDoc.SelectSingleNode("Employees");//查找<Employees>XmlElement xe1=xmlDoc.CreateElement("Node");//创建⼀个<Node>节点xe1.SetAttribute("genre","张三");//设置该节点genre属性xe1.SetAttribute("ISBN","1-1111-1");//设置该节点ISBN属性XmlElement xesub1=xmlDoc.CreateElement("title");xesub1.InnerText="C#⼊门帮助";//设置⽂本节点xe1.AppendChild(xesub1);//添加到<Node>节点中XmlElement xesub2=xmlDoc.CreateElement("author");xesub2.InnerText="⾼⼿";xe1.AppendChild(xesub2);XmlElement xesub3=xmlDoc.CreateElement("price");xesub3.InnerText="158.3";xe1.AppendChild(xesub3);root.AppendChild(xe1);//添加到<Employees>节点中xmlDoc.Save ( Server.MapPath("data.xml") );//////////////////////////////////////////////////////////////////////////////////////结果:在xml原有的内容⾥添加了⼀个结点,内容如下,<?xml version="1.0"encoding="gb2312"?><Employees><Node genre="李赞红"ISBN="2-3631-4"><title>CS从⼊门到精通</title><author>候捷</author><price>58.3</price></Node><Node genre="李赞红"ISBN="2-3631-4"><title>CS从⼊门到精通</title><author>候捷</author><price>58.3</price></Node><Node genre="张三"ISBN="1-1111-1"><title>C#⼊门帮助</title><author>⾼⼿</author><price>158.3</price></Node></Employees>3,修改结点的值(属性和⼦结点):XmlDocument xmlDoc=new XmlDocument();xmlDoc.Load( Server.MapPath("data.xml") );XmlNodeList nodeList=xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有⼦节点foreach(XmlNode xn in nodeList)//遍历所有⼦节点{XmlElement xe=(XmlElement)xn;//将⼦节点类型转换为XmlElement类型if(xe.GetAttribute("genre")=="张三")//如果genre属性值为“张三”{xe.SetAttribute("genre","update张三");//则修改该属性为“update张三”XmlNodeList nls=xe.ChildNodes;//继续获取xe⼦节点的所有⼦节点foreach(XmlNode xn1 in nls)//遍历{XmlElement xe2=(XmlElement)xn1;//转换类型if(=="author")//如果找到{xe2.InnerText="亚胜";//则修改}}}}xmlDoc.Save( Server.MapPath("data.xml") );//保存。
Xml作为一个非常重要的纯文本格式已经进入了编程的很多领域,作为一个面向应用层面的c#也一样在很多领域离不开Xm l。
但是,c#在很多方面对X ml做了写封装,以至于很多操作Xml的代码,都不需要手动去写。
例如,c#写WebSer vice这种需要大量操作Xml的服务,除了极其个别的情况下,基本看不到任何操作Xml的代码。
这是c#的一个优势,但是,最近发现正是这样一些c#的优势,导致了新一代c#程序员的能力退化。
因为90%的情况下,不需要手动操作Xml,所以,年轻的c#程序员也觉得没必要为了这10%的情况,而去学如何手工读写Xml。
真不知道,ms 提供了这么简便的工具,是ms做的善事还是作的孽。
好吧,废话就不说了,转入主题。
1.如何用XmlDom的方式读取XmlXml Dom方式是最原始的一种操作Xml的途径,从.net Framewo rk 1.0开始就开始支持Dom方式。
1.1如何以Dom方式加载Xm l要读取Xml首先要加载Xm l,加载的方式有两种,一种是从流或类似的Read er加载,例如:当然还可以从字符串加载:1.1读取无nam espace的XmlXml已经准备好了,下面就开始读取这个Xml。
现在希望读取d ata节下面的所有ite m中的tex t,那么就可以:看看运行结果:但是,这样写的问题有很多,例如在data节点中有非i tem的节点,这样访问,也就被无差别的把非item项也写出来了。
例如把如果数据改成这样:这样,在data节里面,除了4个ite m,还有一个oth er,这个other是不需要的,必须被排除掉,如果直接用第一中Child Nodes去访问的话,会得到这样的结果:显然“!@#”也被选择出来了,这可不是我们所期望的,所以,改用XPath的方式访问:其运行结果为:很好的othe r项排除在需要的节点外,这才是我们真正想要的结果:)1.2读取有nam espace的Xml和c#一样Xml也有namesp ace,并且names pace在X ml中的作用巨大,也许你并未感受到names pace的作用,但是,你可能已经不得不面对那些有namesp ace的Xm l了。