www.devleap.comwww.devleap.com
WebCastWebCastXML e .NET XML e .NET FrameworkFramework
Paolo PialorsiPaolo PialorsiMCSD.NET MCAD MCSE2000 MCSA MCTMCSD.NET MCAD MCSE2000 MCSA MCT
[email protected]@devleap.comomItalian BLog: Italian BLog: http://blogs.devleap.com/paolo.bloghttp://blogs.devleap.com/paolo.blog
www.devleap.com
AgendaAgenda• System.XmlSystem.Xml
• XMLReader, XMLWriter, XMLDocumentXMLReader, XMLWriter, XMLDocument
• System.Xml.XPathSystem.Xml.XPath• XPathDocument, XPathNavigator, XPathExpressionXPathDocument, XPathNavigator, XPathExpression
• System.Xml.XslSystem.Xml.Xsl• XslTransformXslTransform
• System.Xml.SchemaSystem.Xml.Schema• XmlSchema, XmlSchemaCollectionXmlSchema, XmlSchemaCollection
• XML con ASP.NET e ADO.NETXML con ASP.NET e ADO.NET
www.devleap.com
Scopo di questa sessioneScopo di questa sessione
• Capire come:Capire come:• utilizzare i documenti XMLutilizzare i documenti XML• sfruttare le tecnologie del mondo XMLsfruttare le tecnologie del mondo XML
• All’interno di applicazioni realizzate con All’interno di applicazioni realizzate con il .NET Frameworkil .NET Framework
• Avremo un approccio pratico, di quasi Avremo un approccio pratico, di quasi tutto vedremo il codice di esempiotutto vedremo il codice di esempio
www.devleap.com
System.XMLSystem.XML• Tecnologie e standard supportati:Tecnologie e standard supportati:
• XML, Namespaces, XSLT, XPath, XSD, Document XML, Namespaces, XSLT, XPath, XSD, Document Object ModelObject Model
• EstendibilitàEstendibilità• si basa su classi astratte che si possono ereditaresi basa su classi astratte che si possono ereditare• fornisce già delle classi di uso comune che fornisce già delle classi di uso comune che
ereditano dalle classi astratteereditano dalle classi astratte
• Incremento delle prestazioni rispetto ad Incremento delle prestazioni rispetto ad MSXMLMSXML
• Fortemente legato ad ADO.NETFortemente legato ad ADO.NET• Non è un’evoluzione di MSXMLNon è un’evoluzione di MSXML• E’ completamente diverso !E’ completamente diverso !
www.devleap.com
Classi astratte eClassi astratte eimplementazioni di baseimplementazioni di base
XmlTextWriter
XmlReader XmlWriterXML 1.0NamespacesAstratta Astratta
XmlTextReader XmlNodeReader
www.devleap.com
XMLReaderXMLReader• E’ una classa astratta (MustOverride/abstract)E’ una classa astratta (MustOverride/abstract)
• Non possiamo quindi istanziarla direttamenteNon possiamo quindi istanziarla direttamente
• Rappresenta un cursore forward-only read-only privo Rappresenta un cursore forward-only read-only privo di cachingdi caching
• E’ pensata per leggere velocemente documenti XML E’ pensata per leggere velocemente documenti XML senza tenere traccia di ciò che è già stato processato senza tenere traccia di ciò che è già stato processato (idea già presente in SAX)(idea già presente in SAX)
• Funziona in modalità Pull mentre SAX ragiona in Funziona in modalità Pull mentre SAX ragiona in modalità Pushmodalità Push
www.devleap.com
XmlTextReaderXmlTextReader
• Eredita da XmlReaderEredita da XmlReader• Può caricare il contenuto di:Può caricare il contenuto di:
• TextReader, Stream, Stringhe, Url, FileTextReader, Stream, Stringhe, Url, FileImports System.Xml...
Dim objXMLTextReader As System.Xml.XmlTextReaderobjXMLTextReader = New XmlTextReader("C:\Ordine.XML")With objXMLTextReader
While .Read()Select Case .NodeType
Case XmlNodeType.Element...
End SelectEnd While
End With
www.devleap.com
XmlNodeTypeXmlNodeType
• I principali tipi di nodo che I principali tipi di nodo che XmlTextReader gestisce sono:XmlTextReader gestisce sono:• ProcessingInstructionProcessingInstruction • CommentComment• ElementElement• AttributeAttribute• TextText• EndElementEndElement
<?xml version=“1.0”?><!-- Commento --><root attributo=“valore”>testo</root>
www.devleap.com
XmlDocumentXmlDocument• E’ il buon vecchio E’ il buon vecchio Document Object Model Document Object Model
• Implementa il Livello 1 e 2 del DOM secondo le Implementa il Livello 1 e 2 del DOM secondo le specifiche del W3Cspecifiche del W3C
• Costruisce quindi un in-memory tree del Costruisce quindi un in-memory tree del documento anzichè farne una lettura forward-documento anzichè farne una lettura forward-only read-onlyonly read-only
• Deve essere utilizzato per documenti piccoli in Deve essere utilizzato per documenti piccoli in termini di dimensionitermini di dimensioni
www.devleap.com
DOM Document RecallDOM Document Recall• DOMDocument: classe principale che DOMDocument: classe principale che
identifica un documento XMLidentifica un documento XML
• Metodi principali:Metodi principali:• Load(url/file)Load(url/file)• LoadXML(string)LoadXML(string)• Save(file)Save(file)• Create[Element/Attribute/...]Create[Element/Attribute/...]
• Proprietà principali:Proprietà principali:• documentElementdocumentElement• childNodeschildNodes
www.devleap.com
DOM Node RecallDOM Node Recall• Metodi principali:Metodi principali:
• appendChildappendChild• removeChildremoveChild• cloneNodecloneNode• removeNoderemoveNode
• Proprietà principali:Proprietà principali:• nextSiblingnextSibling• previousSiblingpreviousSibling• firstChildfirstChild• lastChildlastChild• nodeTypenodeType• nodeNamenodeName• valuevalue
www.devleap.com
XmlNodeReaderXmlNodeReader• Eredita da XmlReaderEredita da XmlReader• Carica il contenuto da un oggetto di tipo Carica il contenuto da un oggetto di tipo
XmlNodeXmlNodeDim objXMLNodeReader As System.Xml.XmlNodeReaderDim objXMLDocument As XmlDocument()
objXMLDocument.load ("C:\Ordine.XML")
objXMLNodeReader = New XmlNodeReader(objXMLDocument)With objXMLNodeReader
While .Read()Select Case .NodeType
Case XmlNodeType.Element...
End SelectEnd While
End With
www.devleap.com
XmlTextReader via HTTPXmlTextReader via HTTP• Possiamo caricare documenti XML anche via HTTP Possiamo caricare documenti XML anche via HTTP
tramite XmlTextReadertramite XmlTextReader
• E se dobbiamo “presentarci” al server web che E se dobbiamo “presentarci” al server web che espone i contenuti ?espone i contenuti ?• la proprietà XmlResolver ci permette di fornire una la proprietà XmlResolver ci permette di fornire una
particolare identità al serverparticolare 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?E SAX che fine ha fatto?• SAX = Simple API for XMLSAX = Simple API for XML
• XmlReader sostituisce SAX/SAX2 in quanto le sue XmlReader sostituisce SAX/SAX2 in quanto le sue prestazioni sono migliori e quindi non è più necessario prestazioni sono migliori e quindi non è più necessario usare SAXusare SAX
• XmlReader è più semplice da utilizzareXmlReader è più semplice da utilizzare
• Possiamo comunque ereditare XmlReader in una Possiamo comunque ereditare XmlReader in una nostra classe e costruirci un SAX reader “fatto in casa”nostra classe e costruirci un SAX reader “fatto in casa”
• Oppure possiamo utilizzare via COM-Interop MSXML e Oppure possiamo utilizzare via COM-Interop MSXML e SAXSAX
www.devleap.com
XmlWriterXmlWriter• E’ una classa astratta (MustOverride/abstract)E’ una classa astratta (MustOverride/abstract)
• Come per XmlReader non possiamo Come per XmlReader non possiamo istanziarla direttamenteistanziarla direttamente
• Rappresenta un cursore in scrittura forward-Rappresenta un cursore in scrittura forward-only privo di cachingonly privo di caching
• Produce documenti XML nel rispetto della Produce documenti XML nel rispetto della specifica XML 1.0 del W3Cspecifica XML 1.0 del W3C
www.devleap.com
XmlTextWriterXmlTextWriter• Eredita da XmlWriterEredita da XmlWriter
• Invia il suo output verso:Invia il suo output verso:• TextWriter, Stream, StringheTextWriter, Stream, Stringhe
• Metodi Principali:Metodi Principali:• WriteProcessingInstructionWriteProcessingInstruction• WriteStartDocumentWriteStartDocument• WriteStartElementWriteStartElement• WriteAttributeStringWriteAttributeString• WriteEndElementWriteEndElement• WriteEndDocumentWriteEndDocument
www.devleap.com
Esempio di XmlTextWriterEsempio di XmlTextWriterDim 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.XPathSystem.Xml.XPath
• E’ il namespace del motore XPathE’ il namespace del motore XPath
• Permette di:Permette di:• cercare/filtrare i contenuti di un documento cercare/filtrare i contenuti di un documento
XMLXML• eseguire delle elaborazioni (somme, conteggi, eseguire delle elaborazioni (somme, conteggi,
ecc.) sul contenuto del documento XMLecc.) sul contenuto del documento XML
• Può precompilare le regole/espressioni Può precompilare le regole/espressioni per ottimizzarne l’esecuzioneper ottimizzarne l’esecuzione
www.devleap.com
XPathDocumentXPathDocument• Implementa IXPathNavigableImplementa IXPathNavigable
• Rappresenta un oggetto documento Rappresenta un oggetto documento ottimizzato per la ricerca e la navigazione ottimizzato per la ricerca e la navigazione tramite regole XPathtramite regole XPath
• Lo utilizzeremo anche con XSLTLo utilizzeremo anche con XSLT
• Possiamo costruirlo partendo da:Possiamo costruirlo partendo da:• TextReader, Stream, Stringhe, XmlReader, FileTextReader, Stream, Stringhe, XmlReader, File
www.devleap.com
XPathNavigatorXPathNavigator• E’ una classe astratta (MustOvveride/abstract)E’ una classe astratta (MustOvveride/abstract)
• Lo possiamo ottenere tramite il metodo Lo possiamo ottenere tramite il metodo CreateNavigator di un oggetto di tipo CreateNavigator di un oggetto di tipo XPathDocumentXPathDocument
• Metodi più interessanti:Metodi più interessanti:• Compile: compila una regola XPath e restituisce un Compile: compila una regola XPath e restituisce un
oggetto XPathExpressionoggetto XPathExpression• Evaluate: valuta un’espressione XPath e ne Evaluate: valuta un’espressione XPath e ne
restituisce il risultatorestituisce il risultato• Select: restituisce un XPathIterator sulla base di Select: restituisce un XPathIterator sulla base di
una XPathExpressionuna XPathExpression
www.devleap.com
XPathExpression ed XPathExpression ed XPathIteratorXPathIterator
Dim objXPathDocument As System.Xml.XPath.XPathDocument
Dim objXPathNavigator As System.Xml.XPath.XPathNavigator
Dim objXPathExpression As System.Xml.XPath.XPathExpression
Dim 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.XslSystem.Xml.Xsl
• Le classi principali di questo Le classi principali di questo namespace sono:namespace sono:
• XslTransform: trasforma del contenuto XML XslTransform: trasforma del contenuto XML sulla base di una trasformazione XSL/XSLTsulla base di una trasformazione XSL/XSLT
• XsltArgumentList: permette di definire una XsltArgumentList: permette di definire una lista di parametri da passare ad un XSLT lista di parametri da passare ad un XSLT parametricoparametrico
www.devleap.com
XslTransformXslTransform• Supporta trasformazioni XSL-WD ed XSLT 1.0Supporta trasformazioni XSL-WD ed XSLT 1.0
• Per trasformare del contenuto XML occorre:Per trasformare del contenuto XML occorre:• Istanziare un oggetto XslTransformIstanziare un oggetto XslTransform• Caricare il documento XSLT con il metodo LoadCaricare il documento XSLT con il metodo Load• Avere un XPathNavigator che contiene l’XML di Avere un XPathNavigator che contiene l’XML di
partenzapartenza• Usare il metodo Transform dell’oggetto XslTransform Usare il metodo Transform dell’oggetto XslTransform
fornendo come argomenti il documento XML di fornendo come argomenti il documento XML di input,la destinazione della trasformazione e un input,la destinazione della trasformazione e un XmlResolver (per motivi di sicurezza).XmlResolver (per motivi di sicurezza).
• Possiamo trasformare verso:Possiamo trasformare verso:• XmlReader, Stringhe, Stream, TextReaderXmlReader, Stringhe, Stream, TextReader
www.devleap.com
Esempio di XslTransformEsempio di XslTransform
• Un situazione classica è la Un situazione classica è la trasformazione all’interno di pagine trasformazione all’interno di pagine web (ASPX) con la restituzione web (ASPX) con la restituzione dell’output verso l’oggetto Response: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 ParametriciXSLT Parametrici• Come in MSXML anche in System.XML è Come in MSXML anche in System.XML è
possibile eseguire trasformazioni possibile eseguire trasformazioni parametriche alimentando una collection parametriche alimentando una collection di parametri come se si lavorasse con una di parametri come se si lavorasse con una stored procedure parametricastored procedure parametrica
• Il parametro che nella trasformazione Il parametro che nella trasformazione precedente era Nothing ora conterrà la precedente era Nothing ora conterrà la collection(XsltArgumentList) dei parametri collection(XsltArgumentList) dei parametri da passare alla trasformazione XSLTda passare alla trasformazione XSLT
www.devleap.com
Esempio di XSLT ParametricoEsempio di XSLT ParametricoDim 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.NETXSLT “Automatici” in ASP.NET• Se dobbiamo trasformare XML tramite XSLT Se dobbiamo trasformare XML tramite XSLT
all’interno di pagine ASPX possiamo anche all’interno di pagine ASPX possiamo anche utilizzare un WebControl apposito:utilizzare un WebControl apposito:• System.Web.UI.WebControls.XmlSystem.Web.UI.WebControls.Xml
• Accetta come proprietà:Accetta come proprietà:• DocumentSource: file XML sorgenteDocumentSource: file XML sorgente• TransformSource: file XSLT sorgenteTransformSource: file XSLT sorgente• TransformArgumentList: collection di parametriTransformArgumentList: collection di parametri
• Esegue automaticamente la trasformazione e Esegue automaticamente la trasformazione e restituisce alla Response il risultatorestituisce alla Response il risultato
www.devleap.com
System.Xml.SchemaSystem.Xml.Schema• Esiste un namespace appositamente pensato per la Esiste un namespace appositamente pensato per la
gestione (lettura, scrittura e validazione) degli Schema gestione (lettura, scrittura e validazione) degli Schema XSDXSD
• E’ costituito da 66 diverse classi corrispondenti ai vari E’ costituito da 66 diverse classi corrispondenti ai vari blocchi informativi di uno schema XSD (element, blocchi informativi di uno schema XSD (element, complexType, annotation, ecc.)complexType, annotation, ecc.)
• E’ compatibile al 100% con la raccomandazione W3C E’ compatibile al 100% con la raccomandazione W3C del 2 Maggio 2001del 2 Maggio 2001
• Possiamo costruire da codice degli XML Schema Possiamo costruire da codice degli XML Schema oppure caricare da file esterni gli schema ed applicarli oppure caricare da file esterni gli schema ed applicarli ai documenti XMLai documenti XML
www.devleap.com
Validazione di documenti XMLValidazione di documenti XML• Esiste un XmlReader che valida durante la Esiste un XmlReader che valida durante la
lettura:lettura:• System.Xml.XmlValidatingReaderSystem.Xml.XmlValidatingReader
• Per funzionare richiede che vengano indicati:Per funzionare richiede che vengano indicati:• ValidationType: XSD, XDR, DTD, Auto, NoneValidationType: XSD, XDR, DTD, Auto, None• Schemas: la collection degli Schema da utilizzareSchemas: la collection degli Schema da utilizzare
• Eventuali errori di validazione sono notificati Eventuali errori di validazione sono notificati tramite un evento tramite un evento ValidationEventHandler che ValidationEventHandler che ci fornisce la descrizione precisa dell’erroreci fornisce la descrizione precisa dell’errore
www.devleap.com
ADO.NET ed XMLADO.NET ed XML• In ADO.NET il supporto ad XML non è più In ADO.NET il supporto ad XML non è più
un’estensione come in ADO 2.xun’estensione come in ADO 2.x
• XML e ADO.NET costituiscono un’architettura unica XML e ADO.NET costituiscono un’architettura unica basata sulla rappresentazione nativa dei dati in basata sulla rappresentazione nativa dei dati in formato XMLformato XML
• Oggi un DataSet:Oggi un DataSet:• può caricare e salvare nativamente dati in formato XMLpuò caricare e salvare nativamente dati in formato XML• permette di caricare o creare un XML Schema (XSD) permette di caricare o creare un XML Schema (XSD)
partendo dai dati che contienepartendo dai dati che contiene• può essere associato ad un XmlDataDocument che eredita può essere associato ad un XmlDataDocument che eredita
da XmlDocument ed è quindi utilizzabile con:da XmlDocument ed è quindi utilizzabile con:• System.Xml.SchemaSystem.Xml.Schema• System.Xml.Xsl.XslTransformSystem.Xml.Xsl.XslTransform• System.Xml.XPathSystem.Xml.XPath
www.devleap.com
Generare XML da un DataSetGenerare XML da un DataSetDim 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 DataSetLeggere XML in un DataSet• Il metodo ReadXML legge da:Il metodo ReadXML legge da:
• Stream, Stringhe, TextReader, XmlReaderStream, Stringhe, TextReader, XmlReader
• Per “interpretare” la struttura dati può ragionare in uno dei seguenti Per “interpretare” la struttura dati può ragionare in uno dei seguenti modi (enumerazione XmlReadMode):modi (enumerazione XmlReadMode):• DiffGram: rilegge un documento XML generato con una chiamata a DiffGram: rilegge un documento XML generato con una chiamata a
WriteXml(.., DiffGram) ed apporta le modifiche subite al DataSetWriteXml(.., DiffGram) ed apporta le modifiche subite al DataSet• Fragment: legge documenti xml che hanno al loro interno (inline) uno Fragment: legge documenti xml che hanno al loro interno (inline) uno
schema XDR, per es. i dati esportati da SQL Server 2000 FOR XMLschema 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 IgnoreSchema: legge i dati sulla base dell’attuale stato del DataSet, se non
riesce ad associare qualche informazione alla struttura corrente, la ignorariesce ad associare qualche informazione alla struttura corrente, la ignora• InferSchema: costruisce/estende lo schema interno del DataSet sulla base InferSchema: costruisce/estende lo schema interno del DataSet sulla base
dell’ “aspetto” dei dati ignorando eventuali Schema presenti nel documentodell’ “aspetto” dei dati ignorando eventuali Schema presenti nel documento• ReadSchema: si basa sullo schema presente nel documento e cerca di ReadSchema: si basa sullo schema presente nel documento e cerca di
aggiungere le nuove informazioni al DataSetaggiungere le nuove informazioni al DataSet• Auto: 1) DiffGram, 2) ReadSchema, 3) InferSchemaAuto: 1) DiffGram, 2) ReadSchema, 3) InferSchema
www.devleap.com
ASP.NET, System.XML, ASP.NET, System.XML, ADO.NETADO.NET
ADO.NET
ASP.NET
System.Xml
System.IO.Stream
www.devleap.com
CommunityCommunity
• news.microsoft.comnews.microsoft.commicrosoft.public.it.dotnet.xmlmicrosoft.public.it.dotnet.xml
microsoft.public.it.dotnet.*microsoft.public.it.dotnet.*
• Comunità degli sviluppatoriComunità degli sviluppatorihttp://www.microsoft.com/italy/msdn/community/default.asphttp://www.microsoft.com/italy/msdn/community/default.asp
www.devleap.com
MSDN Webcasts in italianoMSDN Webcasts in italiano
• Stay tuned:Stay tuned:
http://www.microsoft.com/italy/msdn/http://www.microsoft.com/italy/msdn/webcast/webcast/
• Prossimi WebCast su XML:Prossimi WebCast su XML:
Applicazioni reali di XMLApplicazioni reali di XML
2 Marzo 2004 dalle 14.30 alle 16.002 Marzo 2004 dalle 14.30 alle 16.00
www.devleap.com
Altre InformazioniAltre Informazioni
• Dove posso ottenere maggiori Dove posso ottenere maggiori informazioniinformazioni• http://www.devleap.it/http://www.devleap.it/• http://www.gotdotnet.com/http://www.gotdotnet.com/• http://www.microsoft.com/italy/msdn/http://www.microsoft.com/italy/msdn/
• Developer resourcesDeveloper resources• Microsoft Visual Studio.NETMicrosoft Visual Studio.NET• Microsoft .NET Framework SDKMicrosoft .NET Framework SDK• Microsoft Developer NetworkMicrosoft Developer Network
www.devleap.com
Introduzione ad XMLIntroduzione ad XML
I vostri feedback sono importantiI vostri feedback sono importanti•ScriveteciScriveteci
Grazie della partecipazione– A presto
Top Related