ASP.NET Tutorial/XML/XmlSerialization
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>