ASP.NET Tutorial/XML/Schema Validation

Материал из .Net Framework эксперт
Версия от 11:57, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

XML document validation against XML schema

<%@ 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("<font color=\"red\">" + e.Message + "<br>");
         
      if (reader.LineNumber > 0) {
         Response.Write("Line: " + reader.LineNumber + " Position: " + reader.LinePosition + "</font>");
      }
   }
</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>


XML validation

<%@ 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">
    <div class="Box">
    <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>
    </div>
  <div>
    <asp:Label id="lblStatus" runat="server" EnableViewState="False"></asp:Label>
    </div>
    </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 += "<br />Complete.";
  }
  public void ValidateHandler(Object sender, ValidationEventArgs e)
  {
    lblStatus.Text += "Error: " + e.Message + "<br />";
  }
}
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>