WebCast
XML e .NET Framework
Paolo Pialorsi
MCSD.NET MCAD MCSE2000 MCSA MCT
[email protected]
Italian BLog: http://blogs.devleap.com/paolo.blog
www.devleap.com
Agenda
• System.Xml
• XMLReader, XMLWriter, XMLDocument
• System.Xml.XPath
• XPathDocument, XPathNavigator, XPathExpression
• System.Xml.Xsl
• XslTransform
• System.Xml.Schema
• XmlSchema, XmlSchemaCollection
• XML con ASP.NET e ADO.NET
www.devleap.com
Scopo di questa sessione
• Capire come:
• utilizzare i documenti XML
• sfruttare le tecnologie del mondo XML
• All’interno di applicazioni realizzate con il
.NET Framework
• Avremo un approccio pratico, di quasi tutto
vedremo il codice di esempio
www.devleap.com
System.XML
• Tecnologie e standard supportati:
• XML, Namespaces, XSLT, XPath, XSD, Document Object
Model
• Estendibilità
• si basa su classi astratte che si possono ereditare
• fornisce già delle classi di uso comune che ereditano
dalle classi astratte
•
•
•
•
Incremento delle prestazioni rispetto ad MSXML
Fortemente legato ad ADO.NET
Non è un’evoluzione di MSXML
E’ completamente diverso !
www.devleap.com
Classi astratte e
implementazioni di base
Astratta
XmlReader
XmlTextReader
XML 1.0
Namespaces
XmlNodeReader
www.devleap.com
XmlWriter
XmlTextWriter
Astratta
XMLReader
• E’ una classa astratta (MustOverride/abstract)
• Non possiamo quindi istanziarla direttamente
• Rappresenta un cursore forward-only read-only privo di
caching
• E’ pensata per leggere velocemente documenti XML senza
tenere traccia di ciò che è già stato processato (idea già
presente in SAX)
• Funziona in modalità Pull mentre SAX ragiona in modalità
Push
www.devleap.com
XmlTextReader
• Eredita da XmlReader
• Può caricare il contenuto di:
• TextReader, Stream, Stringhe, Url, File
Imports System.Xml
...
Dim objXMLTextReader As System.Xml.XmlTextReader
objXMLTextReader = New XmlTextReader("C:\Ordine.XML")
With objXMLTextReader
While .Read()
Select Case .NodeType
Case XmlNodeType.Element
...
End Select
End While
End With
www.devleap.com
XmlNodeType
• I principali tipi di nodo che XmlTextReader
gestisce sono:
•
•
•
•
•
•
ProcessingInstruction
Comment
Element
Attribute
Text
EndElement
<?xml version=“1.0”?>
<!-- Commento -->
<root attributo=“valore”>testo</root>
www.devleap.com
XmlDocument
• E’ il buon vecchio  Document Object Model
• Implementa il Livello 1 e 2 del DOM secondo le
specifiche del W3C
• Costruisce quindi un in-memory tree del documento
anzichè farne una lettura forward-only read-only
• Deve essere utilizzato per documenti piccoli in
termini di dimensioni
www.devleap.com
DOM Document Recall
• DOMDocument: classe principale che identifica un
documento XML
• Metodi principali:
•
•
•
•
Load(url/file)
LoadXML(string)
Save(file)
Create[Element/Attribute/...]
• Proprietà principali:
• documentElement
• childNodes
www.devleap.com
DOM Node Recall
• Metodi principali:
•
•
•
•
appendChild
removeChild
cloneNode
removeNode
• Proprietà principali:
•
•
•
•
•
•
•
nextSibling
previousSibling
firstChild
lastChild
nodeType
nodeName
value
www.devleap.com
XmlNodeReader
• Eredita da XmlReader
• Carica il contenuto da un oggetto di tipo XmlNode
Dim objXMLNodeReader As System.Xml.XmlNodeReader
Dim objXMLDocument As XmlDocument()
objXMLDocument.load ("C:\Ordine.XML")
objXMLNodeReader = New XmlNodeReader(objXMLDocument)
With objXMLNodeReader
While .Read()
Select Case .NodeType
Case XmlNodeType.Element
...
End Select
End While
End With
www.devleap.com
XmlTextReader via HTTP
• Possiamo caricare documenti XML anche via HTTP tramite
XmlTextReader
• E se dobbiamo “presentarci” al server web che espone i
contenuti ?
• la proprietà XmlResolver ci permette di fornire una particolare
identità al server
Dim objXMLHTTPReader As System.Xml.XmlTextReader
Dim objXMLResolver As New System.Xml.XmlUrlResolver()
objXMLHTTPReader = New XmlTextReader("http://...")
objXMLHTTPReader.XmlResolver = objXMLResolver
objXMLResolver.Credentials = New _
System.Net.NetworkCredential(“User", “Pwd",“DOMAIN")
....
www.devleap.com
E SAX che fine ha fatto?
• SAX = Simple API for XML
• XmlReader sostituisce SAX/SAX2 in quanto le sue prestazioni
sono migliori e quindi non è più necessario usare SAX
• XmlReader è più semplice da utilizzare
• Possiamo comunque ereditare XmlReader in una nostra
classe e costruirci un SAX reader “fatto in casa”
• Oppure possiamo utilizzare via COM-Interop MSXML e SAX
www.devleap.com
XmlWriter
• E’ una classa astratta (MustOverride/abstract)
• Come per XmlReader non possiamo istanziarla
direttamente
• Rappresenta un cursore in scrittura forward-only
privo di caching
• Produce documenti XML nel rispetto della specifica
XML 1.0 del W3C
www.devleap.com
XmlTextWriter
• Eredita da XmlWriter
• Invia il suo output verso:
• TextWriter, Stream, Stringhe
• Metodi Principali:
•
•
•
•
•
•
WriteProcessingInstruction
WriteStartDocument
WriteStartElement
WriteAttributeString
WriteEndElement
WriteEndDocument
www.devleap.com
Esempio di XmlTextWriter
Dim objXMLTextWriter As System.Xml.XmlTextWriter
objXMLTextWriter = New XmlTextWriter(“file.xml", _
System.Text.Encoding.UTF8)
With objXMLTextWriter
.WriteStartDocument()
.WriteStartElement("Ordine")
.WriteStartElement("Cliente")
.WriteAttributeString("idCliente", "PP2305")
.WriteElementString("Nome", "Paolo")
.WriteElementString("Cognome", "Pialorsi")
...
.WriteEndElement()
.WriteEndElement()
.WriteEndDocument()
.Close()
End With
www.devleap.com
System.Xml.XPath
• E’ il namespace del motore XPath
• Permette di:
• cercare/filtrare i contenuti di un documento XML
• eseguire delle elaborazioni (somme, conteggi,
ecc.) sul contenuto del documento XML
• Può precompilare le regole/espressioni per
ottimizzarne l’esecuzione
www.devleap.com
XPathDocument
• Implementa IXPathNavigable
• Rappresenta un oggetto documento ottimizzato per
la ricerca e la navigazione tramite regole XPath
• Lo utilizzeremo anche con XSLT
• Possiamo costruirlo partendo da:
• TextReader, Stream, Stringhe, XmlReader, File
www.devleap.com
XPathNavigator
• E’ una classe astratta (MustOvveride/abstract)
• Lo possiamo ottenere tramite il metodo
CreateNavigator di un oggetto di tipo
XPathDocument
• Metodi più interessanti:
• Compile: compila una regola XPath e restituisce un
oggetto XPathExpression
• Evaluate: valuta un’espressione XPath e ne restituisce il
risultato
• Select: restituisce un XPathIterator sulla base di una
XPathExpression
www.devleap.com
XPathExpression ed XPathIterator
Dim
Dim
Dim
Dim
objXPathDocument As System.Xml.XPath.XPathDocument
objXPathNavigator As System.Xml.XPath.XPathNavigator
objXPathExpression As System.Xml.XPath.XPathExpression
objXPathNodeIterator As _
System.xml.XPath.XPathNodeIterator
objXPathDocument = New XPathDocument("Ordini.XML")
objXPathNavigator = objXPathDocument.CreateNavigator()
With objXPathNavigator
objXPathExpression = .Compile(strXPathRule)
objXPathNodeIterator = .Select(objXPathExpression)
With objXPathNodeIterator
While .MoveNext()
MsgBox(.Current.Value)
End While
End With
End With
www.devleap.com
System.Xml.Xsl
• Le classi principali di questo namespace
sono:
• XslTransform: trasforma del contenuto XML sulla
base di una trasformazione XSL/XSLT
• XsltArgumentList: permette di definire una lista
di parametri da passare ad un XSLT parametrico
www.devleap.com
XslTransform
• Supporta trasformazioni XSL-WD ed XSLT 1.0
• Per trasformare del contenuto XML occorre:
•
•
•
•
Istanziare un oggetto XslTransform
Caricare il documento XSLT con il metodo Load
Avere un XPathNavigator che contiene l’XML di partenza
Usare il metodo Transform dell’oggetto XslTransform
fornendo come argomenti il documento XML di input,la
destinazione della trasformazione e un XmlResolver (per
motivi di sicurezza).
• Possiamo trasformare verso:
• XmlReader, Stringhe, Stream, TextReader
www.devleap.com
Esempio di XslTransform
• Un situazione classica è la trasformazione
all’interno di pagine web (ASPX) con la
restituzione dell’output verso l’oggetto
Response:
Dim objXMLReader As System.Xml.XmlTextReader
Dim objXPathDocument As System.Xml.XPath.XPathDocument
Dim objXSLTDocument As System.Xml.Xsl.XslTransform
objXMLReader = New XmlTextReader("Ordine.XML")
objXPathDocument = New XPathDocument(objXMLReader)
objXSLTDocument = New XslTransform()
objXSLTDocument.Load("Ordine.XSLT")
objXSLTDocument.Transform(objXPathDocument, Nothing, _
Response.Output, resolver)
www.devleap.com
XSLT Parametrici
• Come in MSXML anche in System.XML è
possibile eseguire trasformazioni
parametriche alimentando una collection di
parametri come se si lavorasse con una
stored procedure parametrica
• Il parametro che nella trasformazione
precedente era Nothing ora conterrà la
collection(XsltArgumentList) dei parametri da
passare alla trasformazione XSLT
www.devleap.com
Esempio di XSLT Parametrico
Dim objXPathDocument As System.Xml.XPath.XPathDocument
Dim objXSLTDocument As System.Xml.Xsl.XslTransform
Dim colArgList As New System.Xml.Xsl.XsltArgumentList()
objXPathDocument = New XPathDocument("Ordine.XML")
objXSLTDocument = New XslTransform()
objXSLTDocument.Load("OrdineParametrico.XSLT")
colArgList.AddParam(“NomePar1", “[NameSpaceURI]", Valore1)
colArgList.AddParam(“NomePar2", “[NameSpaceURI]", Valore2)
...
objXSLTDocument.Transform(objXPathDocument, colArgList, _
Response.Output)
www.devleap.com
XSLT “Automatici” in ASP.NET
• Se dobbiamo trasformare XML tramite XSLT
all’interno di pagine ASPX possiamo anche utilizzare
un WebControl apposito:
• System.Web.UI.WebControls.Xml
• Accetta come proprietà:
• DocumentSource: file XML sorgente
• TransformSource: file XSLT sorgente
• TransformArgumentList: collection di parametri
• Esegue automaticamente la trasformazione e
restituisce alla Response il risultato
www.devleap.com
System.Xml.Schema
• Esiste un namespace appositamente pensato per la gestione
(lettura, scrittura e validazione) degli Schema XSD
• E’ costituito da 66 diverse classi corrispondenti ai vari
blocchi informativi di uno schema XSD (element,
complexType, annotation, ecc.)
• E’ compatibile al 100% con la raccomandazione W3C del 2
Maggio 2001
• Possiamo costruire da codice degli XML Schema oppure
caricare da file esterni gli schema ed applicarli ai documenti
XML
www.devleap.com
Validazione di documenti XML
• Esiste un XmlReader che valida durante la lettura:
• System.Xml.XmlValidatingReader
• Per funzionare richiede che vengano indicati:
• ValidationType: XSD, XDR, DTD, Auto, None
• Schemas: la collection degli Schema da utilizzare
• Eventuali errori di validazione sono notificati tramite
un evento ValidationEventHandler che ci fornisce la
descrizione precisa dell’errore
www.devleap.com
ADO.NET ed XML
• In ADO.NET il supporto ad XML non è più un’estensione
come in ADO 2.x
• XML e ADO.NET costituiscono un’architettura unica basata
sulla rappresentazione nativa dei dati in formato XML
• Oggi un DataSet:
• può caricare e salvare nativamente dati in formato XML
• permette di caricare o creare un XML Schema (XSD) partendo dai
dati che contiene
• può essere associato ad un XmlDataDocument che eredita da
XmlDocument ed è quindi utilizzabile con:
• System.Xml.Schema
• System.Xml.Xsl.XslTransform
• System.Xml.XPath
www.devleap.com
Generare XML da un DataSet
Dim objDataAdapterAs New SqlDataAdapter(…)
Dim objDataSet As New DataSet()
objDataAdapter.Fill(objDataSet)
‘Restituiscono una stringa contenente il DataSet
‘in formato XML o lo Schema XSD dello stesso
MsgBox(objDataSet.GetXml())
MsgBox(objDataSet.GetXmlSchema())
‘Come i metodi precedenti ma scrivono dentro a Stream
‘TextWrite, XmlWriter o Stringhe il contenuto XML
MsgBox(objDataSet.WriteXml(destinazione, modalità))
MsgBox(objDataSet.WriteXmlSchema(destinazione, modalità))
www.devleap.com
Leggere XML in un DataSet
•
Il metodo ReadXML legge da:
• Stream, Stringhe, TextReader, XmlReader
•
Per “interpretare” la struttura dati può ragionare in uno dei seguenti modi
(enumerazione XmlReadMode):
• DiffGram: rilegge un documento XML generato con una chiamata a WriteXml(..,
DiffGram) ed apporta le modifiche subite al DataSet
• Fragment: legge documenti xml che hanno al loro interno (inline) uno schema XDR,
per es. i dati esportati da SQL Server 2000 FOR XML
• IgnoreSchema: legge i dati sulla base dell’attuale stato del DataSet, se non riesce ad
associare qualche informazione alla struttura corrente, la ignora
• InferSchema: costruisce/estende lo schema interno del DataSet sulla base dell’
“aspetto” dei dati ignorando eventuali Schema presenti nel documento
• ReadSchema: si basa sullo schema presente nel documento e cerca di aggiungere le
nuove informazioni al DataSet
• Auto: 1) DiffGram, 2) ReadSchema, 3) InferSchema
www.devleap.com
ASP.NET, System.XML, ADO.NET
ADO.NET
System.Xml
System.IO.Stream
ASP.NET
www.devleap.com
Community
• news.microsoft.com
microsoft.public.it.dotnet.xml
microsoft.public.it.dotnet.*
• Comunità degli sviluppatori
http://www.microsoft.com/italy/msdn/community/default.asp
www.devleap.com
MSDN Webcasts in italiano
• Stay tuned:
http://www.microsoft.com/italy/msdn/webcast/
• Prossimi WebCast su XML:
Applicazioni reali di XML
2 Marzo 2004 dalle 14.30 alle 16.00
www.devleap.com
Altre Informazioni
• Dove posso ottenere maggiori informazioni
• http://www.devleap.it/
• http://www.gotdotnet.com/
• http://www.microsoft.com/italy/msdn/
• Developer resources
• Microsoft Visual Studio.NET
• Microsoft .NET Framework SDK
• Microsoft Developer Network
www.devleap.com
Introduzione ad XML
I vostri feedback sono
importanti
• Scriveteci
Grazie della partecipazione
– A presto
– [email protected]
www.devleap.com
Scarica

WebCast XML e .NET Framework