370 likes | 465 Vues
WebCast XML e .NET Framework. Paolo Pialorsi MCSD.NET MCAD MCSE2000 MCSA MCT paolo@devleap.com Italian BLog: http://blogs.devleap.com/paolo.blog. Agenda . System.Xml XMLReader, XMLWriter, XMLDocument System.Xml.XPath XPathDocument, XPathNavigator, XPathExpression System.Xml.Xsl
E N D
WebCastXML e .NET Framework Paolo Pialorsi MCSD.NET MCAD MCSE2000 MCSA MCT paolo@devleap.com Italian BLog: http://blogs.devleap.com/paolo.blog
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
XML 1.0Namespaces XmlWriter Astratta XmlReader Astratta XmlTextWriter XmlTextReader XmlNodeReader Classi astratte eimplementazioni di base www.devleap.com
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.XmlTextReaderobjXMLTextReader = New XmlTextReader("C:\Ordine.XML")With objXMLTextReader While .Read() Select Case .NodeType Case XmlNodeType.Element ... End Select End WhileEnd 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 --><rootattributo=“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.XmlNodeReaderDim 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 WhileEnd 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 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.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
ADO.NET System.Xml System.IO.Stream ASP.NET, System.XML, ADO.NET 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 • info@DevLeap.it www.devleap.com