linq to xml dalla teoria alla pratica - medinfo.dist.unige.itcif\54_e_linq_to_xml.pdf · dalla...

52
Email: [email protected] Blog: http://blogs.ugidotnet.org/raffaele Profilo: https://mvp.support.microsoft.com/profile/raffaele Linq to XML Dalla teoria alla pratica Università di Genova Facoltà di Ingegneria Martedi 16 Dicembre 2008 Venerdi 19 Dicembre 2008

Upload: vuongcong

Post on 02-Dec-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Email: [email protected]: http://blogs.ugidotnet.org/raffaele

Profilo: https://mvp.support.microsoft.com/profile/raffaele

Linq to XML

Dalla teoria alla praticaUniversità di GenovaFacoltà di Ingegneria

Martedi 16 Dicembre 2008Venerdi 19 Dicembre 2008

Page 2: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

IL PERCORSO VERSO I LINGUAGGI FUNZIONALI

Page 3: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Extension Methods (C# 3.0)

• Sono metodi statici che possono essere invocati usando la sintassi del metodo di istanza

• Vanno usati solo quando non è possibile fare diversamente– WPF e Linq ne fanno largo uso per estendere classi già scritte

• Se nella classe estesa esiste già un metodo con quel nome/parametri, ha la precedenza sull'extension method

namespace Raf.Helpers {public static class StringHelper {

public static int ToInt32(this string s) {return Int32.Parse(s);

}}

}

using Raf.Helpers;

......

string s = "2007";int i = s.ToInt32();

Page 4: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Anonymous methods (C# 2.0)

• C'erano una volta i delegate

• Con C# 2.0 è possibile semplificare il loro uso:

• Semplificazione ...

button2.Click += delegate(object sender, EventArgs e){

MessageBox.Show("Click!");};

button1.Click += new EventHandler(button1_Click);...private void button1_Click(object sender, EventArgs e){

MessageBox.Show((sender as Control).Name);}

C# 1.0MyDlg del = new MyDlg(Method);

C# 2.0MyDlg del = Method;

Page 5: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Espressioni Lambda (C# 3.0)• Evoluzione naturale degli Anonymous Methods

– Offrono una sintassi concisa e funzionale per scrivere Anonymous Methods

• Sono tipiche dei linguaggi funzionali

• Rispetto agli Anonymous Methods– I type delle espressioni Lambda possono non essere espliciti (saranno

dedotti)

– La Lambda può essere sia un'espressione che un blocco ({..})

– Le espressioni possono essere convertite in un albero di espressioni

• Le Lambda possono essere usate laddove è atteso un delegate

Timer t = new Timer(x => Console.WriteLine("Tic"), null, 0, 1000);

x => x+1

"goes to"

parametro in ingresso elaborazione

Page 6: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Lambda e i tipi "inferred" (dedotti)

1. "1:15:30" è assegnato a value.– Il tipo dedotto X è string

2. Il compilatore deduce che str sia string perché Parse accetta una stringTimeSpan.Parse(str) restituisce TimeSpan ed è associato a f1.

– Il tipo dedotto di Y è System.TimeSpan

3. ts.TotalSeconds restituisce un double ed è associato a f2.– Il tipo dedotto Z è un double

double seconds = F("1:15:30",str => TimeSpan.Parse(str),ts => ts.TotalSeconds);

static Z F<X, Y, Z>(X value, Func<X, Y> f1, Func<Y, Z> f2) {

return f2(f1(value));}

Page 7: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Query Expressions (C# 3.0)

• Sintassi di query integrata nel linguaggio simile a SQL– Validata dal compilatore e quindi strong-typed

• L'espressione di query inizia con la clausola "from" e termina con una "select" o "group"

• Dopo "from" possono esserci un numero di clausole– from causa la generazione di una o più variabili di iterazione su una

sequenza o su una join di più sequenze– let causa il calcolo di un valore e introduce un identificatore che

rappresenta quel valore– where filtro che esclude dei valori dal risultato– orderby indica l'ordine del risultato– select / group determina la forma del risultato (tipo di oggetto)– join unisce due set di dati secondo un criterio– into permette di riusare il risultato in una nuova query

Page 8: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Expression Trees (C# 3.0)

• Rendono possibile vedere le Lambda come dati anziché come codice eseguibile

• Un'espressione Lambda convertibile ad un tipo D è convertibile ad un expression tree di tipo System.Linq.Expression<D>– È sufficiente che la lambda non abbia block statements

• In pratica sono un binary tree “dati” e non più codice– Serializzabile– Facilmente costruibile designer!– Interpretabile– Permettono la conversione delle query nei provider Linq

Page 9: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Sintassi in azionevar contacts =

from c in customerswhere c.State == "WA"select new { c.Name, c.Phone };

var contacts =customers.Where(c => c.State == "WA").Select(c => new { c.Name, c.Phone });

Extension methods

Lambda expressions

Query expressions

Object initializers

Anonymous types

type inferencedella variabile

locale

Page 10: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

LINQ To ObjectsRestriction WhereProjection Select, SelectManyOrdering OrderBy, ThenByGrouping GroupByJoins Join, GroupJoinQuantifiers Any, AllPartitioning Take, Skip, TakeWhile, SkipWhileSets Distinct, Union, Intersect, ExceptElements First, Last, Single, ElementAtAggregation Count, Sum, Min, Max, AverageConversion ToArray, ToList, ToDictionaryCasting OfType<T>, Cast<T>

Page 11: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Domande ?

Page 12: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

LINQ TO XML

Page 13: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Perché una nuova API?

• XML DOM– Molto completa ma anche complessa– Gestione dei namespace non certo banale

• SAX– Sequenziale e basato su eventi. Spesso inutilizzabile

• Stream (XmlReader / XmlWriter)– Richiede apertura/chiusura di ogni tag. Molto prono ad errori

• XPath– Abbastanza potente ma terribilmente difficile da debuggare

• Linq to XML– Object oriented (es: supporto operatore +)– Gerarchico (rispetta la natura di XML, più facile da leggere)– Interrogabile con Linq (query potenti e semplici da esprimere)

Page 14: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

XDocument

• Rappresenta il documento XML• I metodi Load (statico) e Save permettono di leggere/scrivere

il documento da Stream, XmlReader/Writer, etc.

• Il metodo statico Parse permette di caricare da stringa• Ha una proprietà Root che restituisce un XElement• Ha una proprietà per dichiarare la declaration

– <?xml version="1.0" encoding="utf-8" standalone="yes"?>

• Ha una serie di metodi per aggiungere, eliminare, iterare gli elementi e i suoi children

XDocument doc = XDocument.Load(@"c:\Temp\Rss.xml");

XDocument doc = new XDocument();doc.Declaration = new XDeclaration("1.0", "UTF-8", "yes");

Page 15: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

XNamespace

• Definisce un namespace XML

• Supporta l'operatore + che restituisce un XName

• XName è semplicemente una classe che combina il namespace e il nome dell'elemento– XName si può creare anche con la forma "{...}..."

XNamespace ns = "http://www.unige.it";

XNamespace unige = "http://www.unige.it";XElement root = new XElement(unige + "Root", "Hello, world");

<Root xmlns="http://www.unige.it">Hello, world</Root>

XElement root = new XElement("{"http://www.unige.it"}Root", "Hello, world");

<Root xmlns="http://www.unige.it">Hello, world</Root>

Page 16: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Controllare i namespace

• Vogliamo avere controllo sul prefisso dei namespace

<unige:Root xmlns:unige="http://www.unige.it" xmlns:dist="http://dist.unige.it"><dist:Child>

<unige:DifferentChild>other content</unige:DifferentChild></dist:Child><unige:Child2>c2 content</unige:Child2><dist:Child3>c3 content</dist:Child3>

</unige:Root>

XNamespace unige = "http://www.unige.it";XNamespace dist = "http://dist.unige.it";XElement root = new XElement(unige + "Root",

new XAttribute(XNamespace.Xmlns + "unige", unige),new XAttribute(XNamespace.Xmlns + "dist", dist),new XElement(dist + "Child",

new XElement(unige + "DifferentChild", "other content")),new XElement(unige + "Child2", "c2 content"),new XElement(dist + "Child3", "c3 content")

);

Page 17: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

XElement

• Un elemento semplice

• Composizione di elementi grazie a "params"

XElement el = new XElement(ns + "Saluti", "Hello, world");

XElement el = new XElement(ns + "Saluti",new XAttribute("Language", "English"),"Hello, world");

XElement root = new XElement(ns + "Parole", new XElement(ns + "Saluti",new XAttribute("Language", "English"),"Hello, world"));

<Saluti Language="English" xmlns=http://IAmRaf.net>Hello, world

</Saluti>

<Saluti xmlns=http://IAmRaf.net>Hello, world</Saluti>

<Parole xmlns="http://IAmRaf.net"><Saluti Language="English">Hello, world</Saluti>

</Parole>

Page 18: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

I FORMATI E LE APPLICAZIONI

Page 19: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Il formato binario(.doc, .xls, .ppt)

• Disponibili da sempre (sotto NDA)

• Oggi sono pubblici

• Convertibili in modo automatico e massivo– Compatiblity pack e Migration Planning Manager sono free

• Usati solo per compatibilità verso i vecchi Office– Nessun modo ufficiale per convertire verso il formato

binario

Page 20: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Iniziativa Open Protocols• Pubblicati tutti i protocolli di comunicazione e i

formati usati da Windows e gli altri prodotti Microsoft– http://msdn.microsoft.com/en-us/library/cc216514.aspx

– SMB, BITS, RDP, RPC/HTTP, ...• SMB ... SaMBa per Linux ricorda qualcosa?

– Address Book format, Office Crypto ext., Sharepoint, SMTP extensions (Exchange), ...

• Alcuni di questi sono soggetti a brevetti:– http://www.microsoft.com/about/legal/intellectualproperty/protocols

Page 21: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Microsoft Office

• Versione 2007 SP2 (primavera 2009)– Gestisce anche ODF, PDF e XPS

nativamente

• Versione "Office 14"– Gestione del formato ISO di OOXML

• Versione 97, 2000, XP– Il file binario si può convertire in OOXML con i tool– Il tool è disponibile anche in versione "Shell Extension"

• Versione 2003– Esiste un plugin che gestisce nativamente OOXML

• Versione 2007– Gestisce il formato ECMA di OOXML

Page 22: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Open Office

• Convertitori attuali– La versione Novell già supporta OOXML

• La beta della versione 3.0 supporta OOXML

• Attualmente OpenOffice non supporta ODF– http://www.griffinbrown.co.uk/blog/PermaLink.aspx?guid

=f0384bed-808b-49a8-8887-ea7cde5caace

Page 23: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

OOXML per developers

• OOXML è un formato file standard ISO che definisce la struttura di documenti di tipo Wordprocessing, Spreadsheet, Presentation– Office 2007 lo usa nativamente (docx, xlsx, pptx e derivati)

• OOXML è composto da due livelli di astrazione:– Lo standard OPC

• Definisce il formato fisico (ZIP) e la gerarchia dei file contenuti

– Lo schema dei file XML che rappresentano il documento

Page 24: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

IL PACKAGE OPC

Page 25: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Il Package OPC è un file ZIP

• Open Packaging Conventions (standard ISO)– Il formato file è un normale ZIP

– La struttura interna è definita nello standard

Page 26: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Come manipolare un OPC

• Per leggere/scrivere un file OPC:– Si può gestire "a mano" zip e xml

• Qualsiasi piattaforma può manipolare zip e xml

– Si possono usare le classi del Framework 3.0• System.IO.Packaging.Package, etc.

– Si usa ad esempio per XPS

– Gestisce un 'generico' package

– Si può usare l'Office Open XML SDK• DLL managed che include una serie di classi che conoscono le

"part" specifiche del package di OOXML

Page 27: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Leggere la 'part' principaledi un Package con OOXML SDK (1 e 2)

using (WordprocessingDocument doc = WordprocessingDocument.Open(_FileName, true)){

MainDocumentPart mainPart = doc.MainDocumentPart;

using (StreamReader streamReader = new StreamReader(mainPart.GetStream())){

using (XmlReader stream = XmlReader.Create(streamReader)){

_MainDocument = XElement.Load(stream);}

}}

using (SpreadsheetDocument xlPackage = SpreadsheetDocument.Open(_FileName, true)){

WorkbookPart workbook = xlPackage.WorkbookPart;

OpenXmlPart part = workbook.GetPartById(Id);using (StreamReader streamReader = new StreamReader(part.GetStream())){

using (XmlReader stream = XmlReader.Create(streamReader)){

_CurrentSheet = XElement.Load(stream);}

}// ....

}

OutputXElement

Input

Page 28: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

WORDPROCESSINGMLWord Processing Markup Language

Page 29: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

WordprocessingML

• La "MainDocumentPart" contiene il corpo del documento

• Tramite relazioni OPC alla MainDocumentPart sono collegati altri file XML– File binari per le immagini

– HeaderPart: rappresenta gli header

– FooterPart: rappresenta i footer

– Settings part: le impostazioni per il viewer (Word), per la compatibilità con versioni precedenti e la conversione in Html

– Numbering: le impostazioni sulla formattazione degli elenchi putntati e numerati

– ... altre parts ...

Page 30: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Struttura e query di un documentoInformazioni essenziali

• Ogni tag appartiene ad unnamespacexmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:o="urn:schemas-microsoft-com:office:office"xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"xmlns:v="urn:schemas-microsoft-com:vml"xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"xmlns:w10="urn:schemas-microsoft-com:office:word"xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><w:document

xmlns:w=http://schemas.openxmlformats.org/wordprocessingml/2006/main<w:body>

<w:p><w:r>

<w:t>Hello, world</w:t></w:r>

</w:p></w:body>

</w:document>

public IEnumerable<XElement> FindOccurrenceOf(string text){

var v =from b in MainDocument.Descendants(NS_w + "body")from p in b.Elements(NS_w + "p")from r in p.Elements(NS_w + "r")from t in r.Elements(NS_w + "t")where ((string)t).Contains(text)select t;

return v;}

Page 31: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Formattazione

• Bold Italic Underline Highlited<w:r>

<w:rPr><w:b/>

</w:rPr><w:t>Grassetto/w:t>

</w:r>

<w:r><w:rPr>

<w:i/></w:rPr><w:t>Corsivo</w:t>

</w:r>

<w:r><w:rPr>

<w:u/></w:rPr><w:t>Sottolinea</w:t>

</w:r>

<w:r><w:rPr>

<w:highlightw:val="yellow"/>

</w:rPr><w:t>Evidenziato</w:t>

</w:r>

public IEnumerable<string> GetBoldWords(){

IEnumerable<string> words =from b in MainDocument.Descendants(NS_w + "body")from p in b.Elements(NS_w + "p")from r in p.Elements(NS_w + "r")where r.Descendants(NS_w + "rPr").Descendants(NS_w + "b").Count() == 1select (string)r.Descendants(NS_w + "t").First();

return words;}

Page 32: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Formattazione di run o paragrafo• Si possono formattare i paragrafi <pPr/> o i run <rPr/>

– Possono esistere più <r> dentro un paragrafo. Questo consente una formattazione differenziata

• Colore del testo (Test)– <w:color w:val="FF0000"/>

• StrikeThrough (Test)– <w:strike/>

• Superscript (Test)– <w:vertAlign w:val="superscript"/>

• Subscript (Test)– <w:vertAlign w:val="subscript"/>

• Font Size (Test)– <w:sz w:val="40"/>

• Dentro <t> si usa 'preserve' per conservare lo spazio a inizio o fine testo– <w:t xml:space="preserve">: </w:t>

Page 33: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Formattazione di paragrafo

• Giustificazione– <w:jc w:val="right"/> (left, center, both, ...)

• Spaziatura– <w:spacing w:after="0" w:line="240" w:lineRule="auto"/>

– Conversioni• Per i twips la conversione è (int)(val * 1440)

• La spaziatura si converte con (int)(NumLines * 240.0m)

• Le specifiche spiegano come, dove, quando

• Cambio pagina– <w:r> ... <w:br w:type="page"/> ... </w:r>

Page 34: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Costuire un documento con XDocument (Linq to XML)

• Creo con Word un documento

• "Paste as XML"

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">

<w:body><w:p>

<w:r><w:t>Simple Text</w:t>

</w:r></w:p>

</w:body></w:document>

XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";XElement xml = new XElement(w + "document",

new XAttribute(XNamespace.Xmlns + "w", w),new XElement(w + "body",

new XElement(w + "p",new XElement(w + "r",

new XElement(w + "t", "Simple Text"))

))

);

Page 35: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

WORDPROCESSING DOCUMENT

Page 36: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

SPREADSHEETMLSpreadSheet Markup Language

Page 37: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

SpreadSheetML• Il file del WorkBook tiene solo l'elenco dei sheet

– Un documento XML per ogni "Sheet"– In ogni Sheet c'è una root <sheetData />– Per ogni sheetData ci sono le <row/>– Per ogni row ci sono le <c /> (cells)

• Cells:– Attributo "r" definisce il reference espresso in stile "A1" (r="B2")– Attributo "s" l'indice nella part degli stili (s="3")– Attributo "t" definisce il data type

• b = bool, s = shared string, inlineStr = inline string, n = number

• L'elemento child di <c> può essere– Di solito <v> (value)– Se t è inlineStr il child è <is>

• <c r="A1" t="inlineStr"> <is><t>inline string</t></is> </c>– Se c'è una formula il child è <f />

• <c r="A2"> <f>A1+1</f> <v>2</v> </c>• Il numero dentro <v /> è una cache ed è omissibile

Page 38: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Shared String Part

• Una lookup table definisce la lista delle shared string• Dov'è la stringa?

– <c r="A3" s="1" t="s"> <v>0</v> </c>• L'editor può fornire suggerimenti quando

si digitano le prime lettere di unaparola già presente nella tabella

• Le shared string sono in una part separata• In alternativa si può usare inlineStr

– <c r="C1" t="inlineStr"><is>

<t>inline string</t></is>

</c>

<sst xmlns="....." count="3"uniqueCount="2">

<si><t>Rosso</t>

</si><si>

<t>Bianco</t></si>

</sst>

<v>0</v>

<v>1</v>

Page 39: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Caricare le shared stringprivate void LoadSharedStrings(WorkbookPart workbook){

if (_SharedStrings != null) return;

SharedStringTablePart Shared = workbook.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();if (Shared == null){

_SharedStrings = new List<SharedString>(); // lista vuotareturn;

}

using (StreamReader streamReader = new StreamReader(Shared.GetStream())){

using (XmlReader stream = XmlReader.Create(streamReader)){

int index = 0;XElement shs = XElement.Load(stream);_SharedStrings = from si in shs.Descendants(NS_ex + "si")

from t in si.Descendants(NS_ex + "t")select new SharedString(){

Text = t.Value,Index = index++

};}

}}

Page 40: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Stili e formattazione(relativi alla 'part' degli Styles)

• Dentro <styleSheet /> ci sono due livelli di formattazione– <c r="B2" s="1"> <v>39451.413006267</v> </c>

<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0">

<alignment horizontal="left" indent="0" textRotation="0" vertical="bottom" wrapText="0" /></xf>

</cellStyleXfs><cellXfs count="2">

<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"><alignment horizontal="left" indent="0" textRotation="0" vertical="bottom" wrapText="0" />

</xf><xf numFmtId="14" fontId="0" fillId="0" borderId="1" xfId="0">

<alignment horizontal="left" indent="0" textRotation="0" vertical="bottom" wrapText="0" /></xf><xf numFmtId="164" fontId="0" fillId="0" borderId="1" xfId="0">

<alignment horizontal="left" indent="0" textRotation="0" vertical="bottom" wrapText="0" /></xf>

</cellXfs>

Master styleElemento 0

Stili referenziati dalle celle

Elemento 1

Page 41: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Stili e formattazione

• La data è solo un numero formattato in modo data– fontId, fillId, etc. si riferiscono ai vari fragment xml

– numFmtId: la formattazione predefinita non necessita del corrispondente <numFmt /> (vedi specs per la lista)

<xf numFmtId="164" fontId="0" fillId="0" borderId="1" xfId="0"><alignment horizontal="left" indent="0" textRotation="0" vertical="bottom" wrapText="0" />

</xf>

<fonts count="1"><font>

<sz val="11" /><color auto="1" /><name val="Calibri" /><family val="2" /><scheme val="minor" />

</font></fonts>

<numFmts count="1"><numFmt numFmtId="164"

formatCode="#.##0,000000" /></numFmts>

Page 42: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Cercare in uno SpreadSheetMLpublic IEnumerable<CellSearch> FindOccurrenceOf(string text){

var inlinesimple =from d in _CurrentSheet.Descendants(NS_ex + "sheetData")from row in d.Descendants(NS_ex + "row")from c in row.Descendants(NS_ex + "c")from istag in c.Descendants(NS_ex + "is")from t in istag.Descendants(NS_ex + "t")where t.Value.Contains(text)select new CellSearch() { Cell = c.Attribute(XName.Get("r")).Value, Text = t.Value };

var inlinerich =from d in _CurrentSheet.Descendants(NS_ex + "sheetData")from row in d.Descendants(NS_ex + "row")from c in row.Descendants(NS_ex + "c")from istag in c.Descendants(NS_ex + "is")from r in c.Descendants(NS_ex + "istag")from t in istag.Descendants(NS_ex + "r")where t.Value.Contains(text)select new CellSearch() { Cell = c.Attribute(XName.Get("r")).Value, Text = t.Value };

var shared =from d in _CurrentSheet.Descendants(NS_ex + "sheetData")from row in d.Descendants(NS_ex + "row")from c in row.Descendants(NS_ex + "c")from v in c.Descendants(NS_ex + "v")where c.Attribute(XName.Get("t")).Value == "s"join ss in _SharedStrings on int.Parse(v.Value) equals ss.Indexwhere ss.Text.Contains(text)select new CellSearch() { Cell = c.Attribute(XName.Get("r")).Value, Text = ss.Text };

var res = inlinesimple.Union(inlinerich).Union(shared);return res;

}

Page 43: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

LINK UTILI

Page 44: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Info di base• Home per developers

– http://openxmldeveloper.org/• Introduzione al formato OOXML

– http://msdn.microsoft.com/en-us/library/aa338205.aspx• Office OpenXML SDK 1.0

• Documentazione– http://msdn.microsoft.com/en-us/library/bb448854.aspx

• Download– http://www.microsoft.com/downloads/details.aspx?FamilyId=AD0B72FB-4A1D-4C52-BDB5-

7DD7E816D046&displaylang=en

• Office OpenXML SDK 2.0 CTP (no licenza go-live)– Documentazione

• http://msdn.microsoft.com/en-us/library/bb448854(office.14).aspx– Download

• http://www.microsoft.com/downloads/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en

• Poster delle classi di OOXML– http://www.microsoft.com/downloads/details.aspx?familyid=134BCB91-DD7B-4209-AC94-

2699B9366874&displaylang=en

Page 45: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Documentazione standard OOXML

• Standard ECMA TC45 (Office 2007)– http://www.ecma-

international.org/news/TC45_current_work/TC45_available_docs.htm

• Standard ISO/IEC 29500 (Office 14)– http://standards.iso.org/ittf/PubliclyAvailableStandards/in

dex.html

Page 46: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Conversioni e migrazione

• Formato file binario– http://www.microsoft.com/interop/docs/OfficeBinaryFormats.

mspx

• Office Compatibility Pack– http://www.microsoft.com/downloads/details.aspx?FamilyID=9

41b3470-3ae9-4aee-8f43-c6bb74cd1466&displaylang=en

• Office Migration Planning Manager (OMPM)– http://www.microsoft.com/downloads/details.aspx?FamilyID=1

3580cd7-a8bc-40ef-8281-dd2c325a5a81&DisplayLang=en

• Come eseguire conversioni automatiche e massive– http://blogs.msdn.com/ericwhite/archive/2008/09/19/bulk-

convert-doc-to-docx.aspx

Page 47: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Altri convertitori• Convertitore OOXML (WordprocessingML) in XAML (FlowDocument)

– http://www.codeplex.com/Word2007ToXaml• Convertitore doc to docx (presto anche gli altri)

– http://b2xtranslator.sourceforge.net/– Creato da DIaLOGIKa con Microsoft

• Daisy: Digital Accessible Information System– http://sourceforge.net/projects/openxml-daisy– Altre news:

• http://blogs.technet.com/reedblog/archive/2008/01/25/open-xml-to-daisy-v1-is-live.aspx

• OOXML <-> ODF– http://odf-converter.sourceforge.net/

• Open Office (ODF)– Sun Plugin

• http://www.sun.com/software/star/odf_plugin/index.jsp– Novell lo include nativamente

Page 48: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Tools per OOXML• PowerTools (per PowerShell)

– Iniziativa su Codeplex per script di PowerShell• http://www.codeplex.com/PowerTools• http://blogs.msdn.com/ericwhite/pages/PowerTools.aspx

– Requisiti: Visual Studio express, PowerShell, OpenXML SDK

• Altova Tool per OOXML– http://www.altova.com/

dev_portal_ooxml.html

• XML "Paste As Linq"– Esempi VS2008 (CSharpSamples.zip)

• LinqSamples\PasteXmlAsLinq

• Word 2007 Content Control Toolkit (customXml e binding)– http://www.codeplex.com/dbe

Page 49: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Bloggers

• http://blogs.msdn.com/dmahugh

• http://blogs.msdn.com/ericwhite

• http://blogs.msdn.com/brian_jones

Page 50: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Domande ?

Page 51: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

Adozione dei formati

• Google trends– http://www.google.com/trends?q=.docx%2C+.odt

– http://www.google.com/trends?q=.xlsx%2C+.ods

Page 52: Linq to XML Dalla teoria alla pratica - medinfo.dist.unige.itCif\54_e_Linq_to_XML.pdf · Dalla teoria alla pratica Università di Genova. Facoltà di Ingegneria. ... • Sintassi

I Power Tools per OOXML

Accept-OpenXmlChange Add-OpenXmlContent Add-OpenXmlDigitalSignature Add-OpenXmlDocumentIndex Add-OpenXmlDocumentTOA Add-OpenXmlDocumentTOC Add-OpenXmlDocumentTOF Add-OpenXmlPicture Export-OpenXmlSpreadsheet Export-OpenXmlToHtml Export-OpenXmlWordprocessing Get-OpenXmlBackground Get-OpenXmlComment Get-OpenXmlCustomXmlData Get-OpenXmlDigitalSignature Get-OpenXmlDocument Get-OpenXmlFooter

Get-OpenXmlHeader Get-OpenXmlStyle Get-OpenXmlTheme Get-OpenXmlWatermark Lock-OpenXmlDocument Remove-OpenXmlComment Remove-OpenXmlDigitalSignature Set-OpenXmlBackground Set-OpenXmlContentFormat Set-OpenXmlContentStyle Set-OpenXmlCustomXmlData Set-OpenXmlFooter Set-OpenXmlHeader Set-OpenXmlStyle Set-OpenXmlTheme Set-OpenXmlWatermark