XML组成结构以及C#通过DTD验证规范性
发布时间:2020-12-16 05:19:53 所属栏目:百科 来源:网络整理
导读:XML 文档包含元素和属性等,它们提供一种灵活且功能强大的方法,为应用程序和组织之间交换数据。所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成: 1、元素 元素是XML的主要构建模块,将xml数据划分为不同部分和语义的标签,如note/note 2、属
XML 文档包含元素和属性等,它们提供一种灵活且功能强大的方法,为应用程序和组织之间交换数据。所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
1、元素 元素是XML的主要构建模块,将xml数据划分为不同部分和语义的标签,如<note></note> 2、属性 属性可提供有关元素的额外信息,被置于元素的开始标签中,总是以名称/值的形式成对出现的。 <img src="computer.gif" /> 元素的名称是 "img"。属性的名称是 "src"。属性的值是 "computer.gif" 3、名称空间 类似于c#中的名称空间,用来隔离相同或不同的元素。 4、实体 实体是用来定义普通文本的变量,定义了一个变量等于某个字符串,然后在XML中就可以直接使用此变量,这个变量就叫做实体。 使用实体之前,必需先声时,声明语句位于xml文档的序言的内部子集中,实体声明必需使用大写方式,如:<!ENTITY myentity "这是一个实体"> ,ENTITY必需是大写的。使用实本时,在实体名称前面加上 &,并表在后面加上分号: ;。 <?xml version="1.0"?> <!DOCTYPE doc [ <!ENTITY number "12345678"> ]> <message> <number>&number;</number> </message> 解析后结果: <message> <number>12345678</number> </message> 5、注释 文档的注解 6、PCDATA PCDATA 的意思是被解析的字符数据(parsed character data)。 可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。 PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。 文本中的标签会被当作标记来处理,而实体会被展开。 7、CDATA CDATA 的意思是字符数据(character data)。在CDATA块中的字符将以原样输出 CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。 8、处理指令 格式<?name data?>,负责与处理器进行交互,每种xml处理器都有一些命令开关。而处理器指令就是调用这些开关的。每个处理器的开关都不尽相 同。<?xml version="1.0" ?> 这个处理指令是每个xml处理器都支持的。 若要指定允许的结构和 XML 文档的内容,可以编写 DTD(Document Type Definition) 、XDR 架构中或 XSD 架构,来验证文档是否符合规范,元素和标签使用是否正确。下面通过DTD来说明,DTD的写法分两种,既可写在同一个xml文件中,也可单独写在另一个文件中。 1、DTD写在同一个xml文件中: Persons.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Persons [ <!ELEMENT Persons (Person+)> <!ELEMENT Person (Name,Age)> <!ELEMENT Name (#PCDATA)> <!ELEMENT Age (#PCDATA)> <!ATTLIST Persons xmlns:xsi CDATA #REQUIRED> <!ATTLIST Persons xmlns CDATA #REQUIRED> <!ATTLIST Person id CDATA #REQUIRED> ]> <Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.xxx.com/XxxSystem"> <Person id="1"> <Name>张三</Name> <Age>18</Age> </Person> <Person id="2"> <Name>李四</Name> <Age>20</Age> </Person> </Persons> 2、DTD单独写在另一个文件中,在xml文档中通过<!DOCTYPE Persons SYSTEM "Persons.dtd">去链接。 Persons.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Persons SYSTEM "Persons.dtd"> <Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.xxx.com/XxxSystem"> <Person id="1"> <Name>张三</Name> <Age>18</Age> </Person> <Person id="2"> <Name>李四</Name> <Age>20</Age> </Person> </Persons>Persons.dtd <!ELEMENT Persons (Person+)> <!ELEMENT Person (Name,Age)> <!ELEMENT Name (#PCDATA)> <!ELEMENT Age (#PCDATA)> <!ATTLIST Persons xmlns:xsi CDATA #REQUIRED> <!ATTLIST Persons xmlns CDATA #REQUIRED> <!ATTLIST Person id CDATA #REQUIRED> 以上 DTD 解释如下: (1) 第2行定义此文档是 Persons 类型的文档。 第3行定义 Persons元素有一个以上子元素:"Person" 第4行定义 Person 元素为两个子元素"Name、Age" 类型 第5行定义 Name 元素为 "#PCDATA" 类型 第6行定义 Age 元素为 "#PCDATA" 类型 第7行定义 Persons 元素必须有属性xmlns:xsi(即命名空间) 第8行定义 Persons 元素必须有属性xmlns(即命名空间) 第9行定义 Persons 元素必须有属性id (2)Person+的+代表此标记必须出现一次以上,常见: ? 不出现或只出现一次 * 不出现或可出现多次 + 必须出现一次以上 无符号 只能出现一次 (3)ELEMENT代表元素,ATTLIST代表属性,属性语法: <!ATTLIST 元素名称 属性名称 属性类型 默认值> 属性的默认值 #REQUIRED 属性值是必需的 #IMPLIED 属性不是必需的 #FIXED value 属性值是固定的 C# 通过DTD验证XML文档方法。 参考了 http://msdn.microsoft.com/en-us/library/z2adhb2f.aspx一文,做了一些改动。 /// <summary> /// 使用DTD验证xml文档格式 /// </summary> /// <param name="filename">xml文件名</param> /// <returns>验证通过返回空字符串,否则返回错误提示信息</returns> public static string ValidXmlByDTD(string filename) { StringBuilder sb = new StringBuilder(); XmlReaderSettings settings = new XmlReaderSettings(); settings.DtdProcessing = DtdProcessing.Parse; settings.ValidationType = ValidationType.DTD; settings.ValidationEventHandler += delegate(object ss,ValidationEventArgs ee) { sb.AppendFormat("{0}",ee.Message); }; using (XmlReader reader = XmlReader.Create(filename,settings)) { try { while (reader.Read()) ; } catch (Exception ex) { //DTD如果有错误,会提示无效的内容模型 return "异常:" + ex.Message; } } return sb.ToString(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- [经验] 使用 jQuery+JSON 实现国际化
- ajax 用法 + json使用方法
- 【全栈React】第7天: 生命周期钩子函数
- c – 有没有理由将这两个函数合并为一个函数?
- ruby-on-rails-4 – 使用simple_hashtag gem链接到模型’bo
- ruby-on-rails – 带有嵌套属性的Rails表单(accepts_nested
- c# – iTextSharp:如果表行不适合当前行,则将其推送到新页
- Cocos2d-x_C++11新特性Lambda表达式
- swift – 使用Vapor 3更改主机名和端口
- [Swift]LeetCode229. 求众数 II | Majority Element II