Este artigo demonstra como mapear automaticamente um fluxo XML específico em um conjunto de objetos destinados a conter o XML usando as classes de serialização XML.
Requisitos
A lista a seguir apresenta o hardware, software, infra-estrutura de rede e pacotes de serviços recomendados necessários:
-
Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server ou Windows NT 4.0 Server.
-
Microsoft Visual Studio .NET.
-
A ferramenta Xsd.exe (fornecida com o Visual Studio .NET e o .Net Framework SDK e localizada em \Arquivos de programas\Microsoft.NET\FrameworkSDK\Bin ou em um local semelhante).
Este artigo supõe que você esteja familiarizado com os seguintes tópicos:
-
Conceitos de serialização
-
Criação e leitura de XML
Como ler e gravar objetos em XML
- Crie classes serializáveis ou classes que foram projetadas para funcionar com as classes de serialização XML. Se você possui uma definição de esquema XML (XSD) que descreve o formato do arquivo XML que deseja carregar ou salvar, use a ferramenta Xsd.exe para criar essas classes automaticamente. Você também pode construí-las manualmente.
Para criar uma classe serializável usando a ferramenta Xsd.exe, siga estas etapas:
- Salve o esquema XSD a seguir, que descreve pedidos de compra, como um arquivo Po.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="" >
<xsd:annotation>
<xsd:documentation>
Purchase order schema for Example.com.
Copyright 2000 Example.com. All rights reserved.
</xsd:documentation>
</xsd:annotation>
<xsd:element name="purchaseOrder" type="PurchaseOrder" />
<xsd:element name="comment" type="xsd:string"/>
<xsd:complexType name="PurchaseOrder">
<xsd:sequence>
<xsd:element name="shipTo" type="USAddress"/>
<xsd:element name="billTo" type="USAddress"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="items" type="Items"/>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
<xsd:complexType name="USAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:NMTOKEN" />
</xsd:complexType>
<xsd:complexType name="Items">
<xsd:sequence>
<xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="productName" type="xsd:string"/>
<xsd:element name="quantity">
<xsd:simpleType>
<xsd:restriction base="xsd:positiveInteger">
<xsd:maxExclusive value="100"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="USPrice" type="xsd:decimal"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="partNum" type="SKU"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="SKU">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}-[A-Z]{2}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema> - Use a ferramenta Xsd.exe para gerar os arquivos de classe.
Por exemplo, o código de linha de comando a seguir gera classes C#:
xsd /classes /language:C# PO.xsd
A ferramenta Xsd.exe gera as seguintes classes para o Visual Basic .Net quando usada com o esquema apresentado anteriormente:
Imports System.Xml.Serialization
Namespace XmlSerializationHowTo
<System.Xml.Serialization.XmlRootAttribute("purchaseOrder", [Namespace]:="", IsNullable:=false)> _
Public Class PurchaseOrder
<System.Xml.Serialization.XmlElementAttribute(IsNullable:=false)> _
Public shipTo As USAddress
<System.Xml.Serialization.XmlElementAttribute(IsNullable:=false)> _
Public billTo As USAddress
<System.Xml.Serialization.XmlElementAttribute(IsNullable:=false)> _
Public comment As String
<System.Xml.Serialization.XmlArrayAttribute(IsNullable:=false), _
System.Xml.Serialization.XmlArrayItemAttribute("item", IsNullable:=false)> _
Public items() As ItemsItem
<System.Xml.Serialization.XmlAttributeAttribute(DataType:="date")> _
Public orderDate As Date
<System.Xml.Serialization.XmlIgnoreAttribute()> _
Public orderDateSpecified As Boolean
End Class
Public Class USAddress
<System.Xml.Serialization.XmlElementAttribute(IsNullable:=false)> _
Public name As String
<System.Xml.Serialization.XmlElementAttribute(IsNullable:=false)> _
Public street As String
<System.Xml.Serialization.XmlElementAttribute(IsNullable:=false)> _
Public city As String
<System.Xml.Serialization.XmlElementAttribute(IsNullable:=false)> _
Public state As String
Public zip As Decimal
<System.Xml.Serialization.XmlAttributeAttribute(DataType:="NMTOKEN")> _
Public country As String
End Class
<System.Xml.Serialization.XmlTypeAttribute([Namespace]:="")> _
Public Class ItemsItem
<System.Xml.Serialization.XmlElementAttribute(IsNullable:=false)> _
Public productName As String
<System.Xml.Serialization.XmlElementAttribute(DataType:="positiveInteger", IsNullable:=false)> _
Public quantity As String
Public USPrice As Decimal
<System.Xml.Serialization.XmlElementAttribute(IsNullable:=false)> _
Public comment As String
<System.Xml.Serialization.XmlElementAttribute(DataType:="date", IsNullable:=false)> _
Public shipDate As Date
<System.Xml.Serialization.XmlIgnoreAttribute()> _
Public shipDateSpecified As Boolean
<System.Xml.Serialization.XmlAttributeAttribute()> _
Public partNum As String
End Class
End Namespace
Observe que a ferramenta Xsd.exe não insere o nome do espaço para nomes com as classes. O usuário deve fazer isso manualmente, dependendo do projeto do aplicativo. Neste exemplo, o espaço para nomes XmlSerializationHowTo é usado para englobar as classes geradas pela ferramenta Xsd.exe.
-
Para criar uma classe serializável usando a ferramenta Xsd.exe, siga estas etapas:
Depois de criar as classes serializáveis, abra o Visual Studio .NET para criar um novo projeto de serialização.
-
Para criar uma classe serializável usando a ferramenta Xsd.exe, siga estas etapas:
Crie um novo aplicativo de console no C# ou no Visual Basic .NET.
-
Para criar uma classe serializável usando a ferramenta Xsd.exe, siga estas etapas:
Insira o arquivo de classe gerado pela ferramenta Xsd.exe no projeto. Para fazer isso, clique com o botão direito do mouse no projeto na janela Solution Explorer, clique em Add, selecione Add Existing Item e procure o arquivo de classe anteriormente gerado.
-
Para criar uma classe serializável usando a ferramenta Xsd.exe, siga estas etapas:
Certifique-se de que o projeto contenha uma referência aos espaços para nomes System.Xml e XmlSerializationHowTo, que foram criados na etapa anterior. Use a instrução IMPORTS no espaço para nomes Xml para que não seja necessário qualificar declarações XmlSerializer nesses espaços para nomes posteriormente no código. Você deve usar a instrução Imports antes de qualquer outra declaração.
Código do Visual Basic .NET
Imports System.Xml.Serialization
Imports System.IO
Imports XmlSerializationHowTo
Código do C#
using System.Xml.Serialization;
using System.IO;
using XmlSerializationHowTo;
-
Para criar uma classe serializável usando a ferramenta Xsd.exe, siga estas etapas:
Crie uma instância da classe XmlSerializer e transmita o tipo de objeto cuja serialização você deseja desfazer. Este exemplo usa o tipo PurchaseOrder anteriormente definido.
Código do Visual Basic .NET
Dim serializer As XmlSerializer = New XmlSerializer(GetType(PurchaseOrder))
Código do C#
XmlSerializer serializer = new XmlSerializer(typeof(PurchaseOrder));
-
Para criar uma classe serializável usando a ferramenta Xsd.exe, siga estas etapas:
Para ler o arquivo, chame o método Deserialize e transmita uma classe Stream, TextReader ou XmlReader. Um pedido de compra é retornado. Neste caso, use o seguinte código: Código do Visual Basic .NET
Dim reader As TextReader = New StreamReader("po.xml")
Dim po As PurchaseOrder = CType(serializer.Deserialize(reader), PurchaseOrder)
reader.Close() Código do C#
TextReader reader = new StreamReader("po.xml");
PurchaseOrder po = (PurchaseOrder)serializer.Deserialize(reader);
reader.Close(); O arquivo Po.xml contém os dados associados a pedidos de compra que seguem o esquema XSD anteriormente definido. Este é o conteúdo do arquivo:
<?xml version='1.0' encoding='ISO-8859-1'?>
<purchaseOrder orderDate="1999-10-20">
<shipTo country="US">
<name>Alice Smith</name>
<street>123 Maple Street</street>
<city>Mill Valley</city>
<state>CA</state>
<zip>90952</zip>
</shipTo>
<billTo country="US">
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
<city>Old Town</city>
<state>PA</state>
<zip>95819</zip>
</billTo>
<comment>Hurry, my lawn is going wild!</comment>
<items>
<item partNum="872-AA">
<productName>Lawnmower</productName>
<quantity>1</quantity>
<price>148.95</price>
<comment>Confirm this is electric</comment>
</item>
<item partNum="926-AA">
<productName>Baby Monitor</productName>
<quantity>1</quantity>
<price>39.98</price>
<shipDate>1999-05-21</shipDate>
</item>
</items>
</purchaseOrder> -
Para criar uma classe serializável usando a ferramenta Xsd.exe, siga estas etapas:
Manipule o objeto PurchaseOrder (por meio da variável PO) como normalmente manipularia qualquer objeto.
-
Para criar uma classe serializável usando a ferramenta Xsd.exe, siga estas etapas:
Salve os dados alterados em um novo arquivo XML. Para gravar o arquivo, chame o método Serialize e transmita uma classe Stream, TextReader ou XmlReader, bem como uma instância do pedido de compra:
Código do Visual Basic .NET
Dim writer As TextWriter = New StreamWriter("po2.xml")
serializer.Serialize(writer, po)
writer.Close()
Código do C#
TextWriter writer = new StreamWriter("po2.xml");
serializer.Serialize(writer, po);
writer.Close(); -
Para criar uma classe serializável usando a ferramenta Xsd.exe, siga estas etapas:
Salve e feche o projeto.
REFERÊNCIAS
Para obter mais informações sobre as classes
XmlSerializer,
StreamWriter e
StreamReader, consulte a documentação do .NET Framework Class Library.
Para obter mais informações sobre serialização, consulte a documentação do .NET Framework Developer's Guide.
Para obter mais informações sobre como usar a ferramenta de definição de esquemas XML (XSD.exe), consulte a documentação do .NET Framework Developer's Guide ou a documentação do .NET Framework Tools.