zoukankan      html  css  js  c++  java
  • 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

    <?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();
    }
    



  • 相关阅读:
    Visifire正式版(v1.1)发布
    [转]PSP机能强大!已能模拟运行WINDOWS系统?
    在Silverlight+WCF中应用以角色为基础的安全模式(一)基础篇之角色为基础的安全模式简介 Virus
    C#的加密解密算法,包括Silverlight的MD5算法 Virus
    MMORPG programming in Silverlight Tutorial (10)Implement the sprite’s 2D animation (Part IV)
    Game Script: Rescue Bill Gates
    MMORPG programming in Silverlight Tutorial (9)KeyFrame Animation
    MMORPG programming in Silverlight Tutorial (5)Implement the sprite’s 2D animation (Part II)
    MMORPG programming in Silverlight Tutorial (7)Perfect animation
    MMORPG programming in Silverlight Tutorial (3)Animate the object (Part III)
  • 原文地址:https://www.cnblogs.com/riskyer/p/3297327.html
Copyright © 2011-2022 走看看