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