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



  • 相关阅读:
    博客园风格简单修饰(Do It Yourself)
    十大经典排序算法
    物流BOS
    算法设计
    牛客网刷题
    关于上网的问题
    Lucene&Solr
    SSM综合练习
    四十八:WAF绕过-权限控制之代码混淆及行为造轮子
    四十七:WAF绕过-漏洞发现之代理池指纹被动探针
  • 原文地址:https://www.cnblogs.com/riskyer/p/3297327.html
Copyright © 2011-2022 走看看