ASP.NET Tutorial/XML/Schema Validation

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

XML document validation against XML schema

   <source lang="csharp">

<%@ Page Language="C#" %> <%@ Import Namespace="System.Xml" %> <%@ Import Namespace="System.Xml.Schema" %> <script runat="server">

  private XmlTextReader reader;
  private XmlValidatingReader validator;
  
  void Page_Load(Object Sender, EventArgs e) {
     try {
        reader = new XmlTextReader(Server.MapPath("Data.xml"));
        validator = new XmlValidatingReader(reader);
        validator.ValidationType = ValidationType.XDR;
        
        validator.ValidationEventHandler += new ValidationEventHandler(this.ShowError);
        
        while (validator.Read()) {
        }
     } catch (Exception ex) {
        Response.Write("Error accessing XML file");
     } finally {
        reader.Close();
     }
  }
  
  void ShowError(Object Sender, ValidationEventArgs e) {
     Response.Write("" + e.Message + "
"); if (reader.LineNumber > 0) { Response.Write("Line: " + reader.LineNumber + " Position: " + reader.LinePosition + "
"); } }

</script> <html><body> </body></html> File: Data.xml <bookstore xmlns="x-schema:Data.xdr">

 <book genre="novel" style="hardcover">
   <title>title 1</title>
   <price>1.5</price>
   <author>
     <first-name>M</first-name>
     <last-name>A</last-name>
   </author>
 </book>

</bookstore> File: Data.xdr <?xml version="1.0"?> <Schema xmlns="urn:schemas-microsoft-com:xml-data"

       xmlns:dt="urn:schemas-microsoft-com:datatypes">
 <ElementType name="first-name" content="textOnly"/>
 <ElementType name="last-name" content="textOnly"/>
 <ElementType name="name" content="textOnly"/>
 <ElementType name="price" content="textOnly" 
                       dt:type="fixed.14.4"/>
 <ElementType name="author" content="eltOnly" order="one">
   <group order="seq">
     <element type="name"/>
   </group>
   <group order="seq">
     <element type="first-name"/>
     <element type="last-name"/>
   </group>
 </ElementType>
 <ElementType name="title" content="textOnly"/>
 <AttributeType name="genre" dt:type="string"/>
 <AttributeType name="style" dt:type="enumeration"
       dt:values="paperback hardcover"/>
 <ElementType name="book" content="eltOnly">
   <attribute type="genre" required="yes"/>
   <attribute type="style" required="yes"/>
   <element type="title"/>
   <element type="price"/>
   <element type="author"/>
 </ElementType>
<ElementType name="bookstore" content="eltOnly">
   <element type="book"/>
 </ElementType>

</Schema></source>


XML validation

   <source lang="csharp">

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="XmlValidation" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">

   <title>Xml Validation</title>

</head> <body>

   <form id="form1" runat="server">
   <asp:RadioButton id="optValid" 
                    runat="server" 
                    Text="Use Data.xml" 
                    Checked="True" 
                    GroupName="Valid">
       </asp:RadioButton>
   <asp:button id="cmdValidate" 
               runat="server" 
               Text="Validate XML" 
               OnClick="cmdValidate_Click">
       </asp:button>
   <asp:Label id="lblStatus" runat="server" EnableViewState="False"></asp:Label>
   </form>

</body> </html> File: Default.aspx.cs using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Xml.Schema; using System.IO; using System.Xml; public partial class XmlValidation : System.Web.UI.Page {

 protected void cmdValidate_Click(object sender, EventArgs e)
 {
   string filePath = "Data.xml";
     lblStatus.Text = "";
   XmlReaderSettings settings = new XmlReaderSettings();
       settings.Schemas.Add("yourURI",Request.PhysicalApplicationPath + "Data.xsd");
   settings.ValidationType = ValidationType.Schema;
   settings.ValidationEventHandler += new ValidationEventHandler(ValidateHandler);
   FileStream fs = new FileStream(filePath, FileMode.Open);
   
   XmlReader r = XmlReader.Create(fs, settings);
   while (r.Read())
   {
   }
   fs.Close();
   lblStatus.Text += "
Complete."; } public void ValidateHandler(Object sender, ValidationEventArgs e) { lblStatus.Text += "Error: " + e.Message + "
"; }

} File: Data.xml

<?xml version="1.0" standalone="yes"?> <SuperProProductList xmlns="yourURI" >

   <Product ID="1" Name="Chair">
       <Price>49.33</Price>
   </Product>
   <Product ID="2" Name="Car">
       <Price>43398.55</Price>
   </Product>
   <Product ID="3" Name="Fresh Fruit Basket">
       <Price>49.99</Price>
   </Product>

</SuperProProductList> File: Data.xsd <?xml version="1.0"?> <xs:schema

   targetNamespace="yourURI"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   elementFormDefault="qualified"  >
 <xs:element name="SuperProProductList">
   <xs:complexType>
     <xs:sequence maxOccurs="unbounded">
       <xs:element name="Product">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="Price" minOccurs="1" type="xs:double" />
           </xs:sequence>
           <xs:attribute name="ID" use="required" type="xs:int" />
           <xs:attribute name="Name" use="required"  type="xs:string" />
         </xs:complexType>
       </xs:element>
       </xs:sequence>
     </xs:complexType>
 </xs:element>

</xs:schema></source>