ASP.NET Tutorial/XML/XmlSerialization

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

Reading author instances from an XmlReader using XmlSerialization (C#)

   <source lang="csharp">

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

   <title>Untitled Page</title>

</head> <body>

   <form id="form1" runat="server">
   </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.IO; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization;

[XmlRoot(ElementName = "author", Namespace = "http://example.books.ru")] public class Author {

   [XmlElement(ElementName = "first-name")]
   public string FirstName;
   [XmlElement(ElementName = "last-name")]
   public string LastName;

}

public partial class _Default : System.Web.UI.Page {

   protected void Page_Load(object sender, EventArgs e)
   {
       XmlSerializerFactory factory = new XmlSerializerFactory();
       
       XmlReaderSettings settings = new XmlReaderSettings();
       NameTable nt = new NameTable();
       object book = nt.Add("book");
       object price = nt.Add("price");
       object author = nt.Add("author");
       settings.NameTable = nt;
       string booksSchemaFile = Path.rubine(Request.PhysicalApplicationPath, "Data.xsd");
       settings.Schemas.Add(null, XmlReader.Create(booksSchemaFile));
       settings.ValidationType = ValidationType.Schema;
       settings.ValidationFlags =
       XmlSchemaValidationFlags.ReportValidationWarnings;
       settings.ValidationEventHandler +=
               new ValidationEventHandler(settings_ValidationEventHandler);
       settings.IgnoreWhitespace = true;
       settings.IgnoreComments = true;
       string booksFile = Path.rubine(Request.PhysicalApplicationPath, "Data.xml");
       using (XmlReader reader = XmlReader.Create(booksFile, settings))
       {
           while (reader.Read())
           {
               if (reader.NodeType == XmlNodeType.Element && author.Equals(reader.LocalName))
               {
                   XmlSerializer xs = factory.CreateSerializer(typeof(Author));
                   Author a = (Author)xs.Deserialize(reader.ReadSubtree());
                   Response.Write(String.Format("Author: {1}, {0}
", a.FirstName, a.LastName)); } } } } void settings_ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e) { Response.Write(e.Message); }

} File: Data.xml <?xml version="1.0"?> <bookstore xmlns="http://example.books.ru"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <book genre="A" 
         publicationdate="1981" 
         ISBN="1-11111-11-0">
       <title>title 1</title>
       <author>
           <first-name>A</first-name>
           <last-name>B</last-name>
       </author>
       <price>8</price>
   </book>
   <book genre="B" 
         publicationdate="1999" 
         ISBN="0-222-22222-2">
       <title>title 2</title>
       <author>
           <first-name>C</first-name>
           <last-name>D</last-name>
       </author>
       <price>11.99</price>
   </book>

</bookstore> File: Data.xsd <?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://example.books.ru" xmlns="http://example.books.ru" targetNamespace="http://example.books.ru" elementFormDefault="qualified">

 <xsd:element name="bookstore" type="bookstoreType" />
 <xsd:complexType name="bookstoreType">
   <xsd:sequence maxOccurs="unbounded">
     <xsd:element name="book" type="bookType" />
   </xsd:sequence>
 </xsd:complexType>
 <xsd:complexType name="bookType">
   <xsd:sequence>
     <xsd:element name="title" type="xsd:string" />
     <xsd:element name="author" type="authorName" />
     <xsd:element name="price" type="xsd:decimal" />
   </xsd:sequence>
   <xsd:attribute name="genre" type="xsd:string" />
   <xsd:attribute name="publicationdate" type="xsd:string" />
   <xsd:attribute name="ISBN" type="xsd:string" />
 </xsd:complexType>
 <xsd:complexType name="authorName">
   <xsd:sequence>
     <xsd:element name="first-name" type="xsd:string" />
     <xsd:element name="last-name" type="xsd:string" />
   </xsd:sequence>
 </xsd:complexType>

</xsd:schema></source>


Reading author instances from an XmlReader using XmlSerialization (VB)

   <source lang="csharp">

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">

   <title>Untitled Page</title>

</head> <body>

   <form id="form1" runat="server">
   </form>

</body> </html> File: Default.aspx.vb Imports System.IO Imports System.Xml Imports System.Xml.Schema Imports System.Xml.Serialization Partial Class _Default

   Inherits System.Web.UI.Page
   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
          Handles Me.Load
       Dim factory As New XmlSerializerFactory
       Dim settings As New XmlReaderSettings()
       Dim nt As New NameTable()
       Dim book As Object = nt.Add("book")
       Dim price As Object = nt.Add("price")
       Dim author As Object = nt.Add("author")
       settings.NameTable = nt
       Dim booksSchemaFile As String = Path.rubine(Request.PhysicalApplicationPath, "Data.xsd")
       settings.Schemas.Add(Nothing, XmlReader.Create(booksSchemaFile))
       settings.ValidationType = ValidationType.Schema
       settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings
       AddHandler settings.ValidationEventHandler, _
       AddressOf settings_ValidationEventHandler
       settings.IgnoreWhitespace = True
       settings.IgnoreComments = True
       Dim booksFile As String = _
           Path.rubine(Request.PhysicalApplicationPath, "Data.xml")
       Using reader As XmlReader = XmlReader.Create(booksFile, settings)
           While (reader.Read())
               If (reader.NodeType = XmlNodeType.Element And author.Equals(reader.LocalName)) Then
                   Dim xs As XmlSerializer = factory.CreateSerializer(GetType(Author))
                   Dim a As Author = CType(xs.Deserialize(reader.ReadSubtree), Author)
                   Response.Write(String.Format("Author: {1}, {0}
", _ a.FirstName, a.LastName)) End If End While End Using End Sub Sub settings_ValidationEventHandler(ByVal sender As Object, _ ByVal e As System.Xml.Schema.ValidationEventArgs) Response.Write(e.Message) End Sub

End Class <XmlRoot(ElementName:="author", _ Namespace:="http://example.books.ru")> Public Class Author

   <XmlElement(ElementName:="first-name")> Public FirstName As String
   <XmlElement(ElementName:="last-name")> Public LastName As String

End Class File: Data.xml <?xml version="1.0"?> <bookstore xmlns="http://example.books.ru"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <book genre="A" 
         publicationdate="1981" 
         ISBN="1-11111-11-0">
       <title>title 1</title>
       <author>
           <first-name>A</first-name>
           <last-name>B</last-name>
       </author>
       <price>8</price>
   </book>
   <book genre="B" 
         publicationdate="1999" 
         ISBN="0-222-22222-2">
       <title>title 2</title>
       <author>
           <first-name>C</first-name>
           <last-name>D</last-name>
       </author>
       <price>11.99</price>
   </book>

</bookstore> File: Data.xsd <?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://example.books.ru" xmlns="http://example.books.ru" targetNamespace="http://example.books.ru" elementFormDefault="qualified">

 <xsd:element name="bookstore" type="bookstoreType" />
 <xsd:complexType name="bookstoreType">
   <xsd:sequence maxOccurs="unbounded">
     <xsd:element name="book" type="bookType" />
   </xsd:sequence>
 </xsd:complexType>
 <xsd:complexType name="bookType">
   <xsd:sequence>
     <xsd:element name="title" type="xsd:string" />
     <xsd:element name="author" type="authorName" />
     <xsd:element name="price" type="xsd:decimal" />
   </xsd:sequence>
   <xsd:attribute name="genre" type="xsd:string" />
   <xsd:attribute name="publicationdate" type="xsd:string" />
   <xsd:attribute name="ISBN" type="xsd:string" />
 </xsd:complexType>
 <xsd:complexType name="authorName">
   <xsd:sequence>
     <xsd:element name="first-name" type="xsd:string" />
     <xsd:element name="last-name" type="xsd:string" />
   </xsd:sequence>
 </xsd:complexType>

</xsd:schema></source>