• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

XML组成结构以及C#通过DTD验证规范性

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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?

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE Persons [ 
  3. <!ELEMENT Persons (Person+)>
  4. <!ELEMENT Person (Name,Age)>
  5. <!ELEMENT Name (#PCDATA)>
  6. <!ELEMENT Age (#PCDATA)>
  7. <!ATTLIST Persons xmlns:xsi CDATA #REQUIRED>
  8. <!ATTLIST Persons xmlns CDATA #REQUIRED>
  9. <!ATTLIST Person id CDATA #REQUIRED>
  10. ]>
  11. <Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  12. xmlns="http://www.xxx.com/XxxSystem">
  13. <Person >
  14. <Name>李四</Name>
  15. <Age>20</Age>
  16. </Person>
  17. </Persons>

2、DTD单独写在另一个文件中,在xml文档中通过<!DOCTYPE Persons SYSTEM "Persons.dtd">去链接。
Persons.xml

[html] view plaincopyprint?

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE Persons SYSTEM "Persons.dtd">
  3. <Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns="http://www.xxx.com/XxxSystem">
  5. <Person >
  6. <Name>李四</Name>
  7. <Age>20</Age>
  8. </Person>
  9. </Persons>

Persons.dtd

[html] view plaincopyprint?

  1. <!ELEMENT Persons (Person+)>
  2. <!ELEMENT Person (Name,Age)>
  3. <!ELEMENT Name (#PCDATA)>
  4. <!ELEMENT Age (#PCDATA)>
  5. <!ATTLIST Persons xmlns:xsi CDATA #REQUIRED>
  6. <!ATTLIST Persons xmlns CDATA #REQUIRED>
  7. <!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?

  1. /// <summary>
  2. /// 使用DTD验证xml文档格式
  3. /// </summary>
  4. /// <param name="filename">xml文件名</param>
  5. /// <returns>验证通过返回空字符串,否则返回错误提示信息</returns>
  6. public static string ValidXmlByDTD(string filename) 
  7.     StringBuilder sb = new StringBuilder(); 
  8.     XmlReaderSettings settings = new XmlReaderSettings(); 
  9.     settings.DtdProcessing = DtdProcessing.Parse; 
  10.     settings.ValidationType = ValidationType.DTD; 
  11.     settings.ValidationEventHandler += delegate(object ss, ValidationEventArgs ee) 
  12.     { 
  13.         sb.AppendFormat("{0}", ee.Message); 
  14.     }; 
  15. using (XmlReader reader = XmlReader.Create(filename, settings)) 
  16.     { 
  17. try
  18.         { 
  19. while (reader.Read()) ; 
  20.         } 
  21. catch (Exception ex) 
  22.         { 
  23. //DTD如果有错误,会提示无效的内容模型
  24. return "异常:" + ex.Message; 
  25.         } 
  26.     } 
  27. return sb.ToString(); 

 

原文地址:http://blog.csdn.net/gdjlc/article/details/10926229


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
【浙大网新图灵通讯】无废话简单高效C#编码规范20100621发布时间:2022-07-10
下一篇:
C#.NET6.NETCOREEXCEL导入和导出发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap