XML组成结构以及C#通过DTD验证规范性
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
[html] view plaincopyprint?
- <?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
[html] view plaincopyprint?
- <?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
[html] view plaincopyprint?
- <!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一文,做了一些改动。
[csharp] view plaincopyprint?
- /// <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();
- }
原文地址:http://blog.csdn.net/gdjlc/article/details/10926229
XML组成结构以及C#通过DTD验证规范性的更多相关文章
- XML DTD验证
XML DTD验证 一.什么是DTD 文档类型定义(DTD:Document Type Definition)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. DTD 可被成行 ...
- xml基础之二(XML结构【2】)DTD文档模版
xml基础之二(XML结构[2])DTD文档模版 xml 模板 文档结构 我们知道XML主要用于数据的存储和传输,所以无论是自定义还是外部引用DTD模板文档,都是为了突出数据的存储规范.DTD(文档 ...
- DTD验证XML(转)
1.内部DTD 最简单的使用DTD的方法是在XML文件的序言部分加入一个DTD描述,加入的位置是紧接在XML处理指示之后.一个包含DTD的XML文件的结构为: <?xml ve ...
- DTD验证XML文档
DTD验证XML文档 1.DTD简介:DTD是Document Type Definition的缩写,即文档定义 1.1:DTD的内容包含: ...
- dom4j解析xml时取消DTD验证
解决方式整合一下,就分两种: 1.用setFeature() SAXReader reader = new SAXReader();reader.setValidation(false); reade ...
- XML学习笔记(二)-- DTD格式规范
标签(空格分隔): 学习笔记 XML的一个主要目的是允许应用程序之间自由交换结构化的数据,因此要求XML文档具有一致的结构.业务逻辑和规则.可以定义一种模式来定义XML文档的结构,并借此验证XML文档 ...
- 16.XML语法、CDATA、约束(DTD、Schema)讲解
xml主要用来描述数据,比如配置文件,网络之间传输数据等,并且在android中也经常用xml来布局,,接下来便来学习xml常用的东西 1.XML语法 xml语法分为: 1.1 文档声明 必须位于文档 ...
- XML、XSL、XSLT、DTD、XSD的区别
前言: 在众神的努力之下,js已经可以跨出浏览器走向不同的领域了 也因为这个,对前端工程师的要求也不仅仅是会写写h5页面做交互.前端涉及的领域越来越广,对开发人员对素质能力要求越高. 以前因设备不同导 ...
- udp开发-dtd验证,dom解析
//博主太懒了,并没有提供范例程序 6.基于UDP开发 (1)发送方:socket->准备数据包 DatagramSocket docket = new DatagramSocket(); // ...
随机推荐
- JDBC代码示例
package test; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;imp ...
- apt-get install *** 出现 软件包***没有提供可供安装的候选者
今天,重新安装Ubuntu13.04后,在命令行输入 sudo apt-get install aptitude 提示: 软件包 aptitude 没有提供可供安装的候选者 sudo apt-get ...
- 【转】java中volatile关键字的含义
java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
- software_testing_work3_question1
package com.Phantom; import java.io.IOException; import java.util.Scanner; public class Work3_1 { /* ...
- Win10/UWP新特性—SharedStorageAccessManager 共享文件
首先先给大家推荐一个UWP/Win10开发者群:53078485 里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStor ...
- devenv命令详解
devenv [解决方案文件 | 项目文件 | 任意文件.扩展名] [开关] devenv 的第一个参数通常是一个解决方案文件或项目文件. 如果您希望在编辑器中自动打开文件, 也可以使用任何其他文 ...
- python webdriver 自动化测试练习 1-- 在线调查
__author__ = 'Mickey0s' # coding:utf8 from selenium import webdriver from selenium.webdriver.common. ...
- UIkit折腾
镜像命令: sudo npm install --registry=http://registry.npm.taobao.org/ --disturl=https://npm.taobao.org/d ...
- mac上使用imagealpha命令对图片进行压缩批处理
#! /bin/bash #BASE_DIR="/Users/jiading/Documents/basepng"; #OUTPUT_DIR="/Users/jiadin ...
- SQL --Chapter02 查询基础
SELECT 语句基础 SELECT <列名>,….. FROM <表名>; 查询全部列: SELECT * FROM <表名>; 使用AS关键字为列设置别名,设定 ...