Your SlideShare is downloading. ×
0
Scala XML – Einfache XML Verarbeitung Tobias Neumann | ITGAIN Consulting
<ul><li>XML Literale,  Embedded Expressions </li></ul>
XML Literale <ul><li>Scala hat direkte XML-Sprachunterstütung </li></ul><ul><li>XML Literale sind &quot;first-class&quot; ...
XML Element <ul><li>case class  Elem ( val override  prefix  : java.lang.String, val  label  : java.lang.String,  val over...
Attribute <ul><li>Attribute im XML-Literal val order = <order prio=&quot;high&quot;></order> </li></ul><ul><li>Attribute s...
Namespaces <ul><li>Namespaces im XML-Literal val order = <o:order xmlns:o=&quot;http://company.com&quot;></o:order> </li><...
Übersicht XML Klassen <ul><li>Node: Superklasse aller XML-Nodes </li></ul><ul><li>NodeSeq: Sequence von Nodes, jede Node e...
Embedded Expressions <ul><li>Scala Code ist innerhalb des XML Literals ausführbar: <quantity> { 3+5 } </quantity> val quan...
Embedded Expressions <ul><li>Wenn Ergebnis vom Typ Node oder NodeSeq ist, wird dieses direkt eingefügt </li></ul><ul><li>v...
Serialisierung <ul><li>Einfache Serialisierung mit Embedded Expressions </li></ul><ul><li>case class item(val itemNo, val ...
XML Laden und Speichern <ul><li>XML.load </li></ul><ul><ul><li>Lädt XML aus Reader, InputStream, etc. </li></ul></ul><ul><...
<ul><li>Pattern matching </li></ul>
Pattern matching <ul><li>Pattern matching auf XML Literale </li></ul><ul><li>{} ist hier kein Ausdruck, sondern das Patter...
Pattern matching <ul><li>Alle Möglichkeiten des Pattern Matching </li></ul><ul><li>Binden von Variablen mit @ </li></ul><u...
Update/Add Nodes <ul><li>Pattern matching kann gut genutzt werden für Updaten und Hinzufügen von Node </li></ul><ul><li>de...
XSLT-like Transformation <ul><li>Pattern matching bietet XSLT-ähnliche Transformation von XML </li></ul><ul><li>Definition...
<ul><li>Xpath-like Queries </li></ul>
XPath-like Queries <ul><li>Die Methoden  und bieten Xpath-ähnliche Abfragen auf Nodes </li></ul><ul><li>Ergebnis ist wiede...
Deserialisierung <ul><li>Deserisalisierung mit XPath: </li></ul><ul><li>def fromXML(n: Node): Item = { </li></ul><ul><li>n...
Transformation <ul><li>Transformation mit XPath </li></ul><ul><li>def transformOrderlist(node: Node): Node = {  def transf...
XML-Validierung <ul><li>XML.load() lädt immer die eingebundene DTD/XSD Datei </li></ul><ul><li>Offensichtlich wird aber ni...
Beispiel: Scala XML in Lift <ul><li>Verwendung von XML-Literalen in Lift: </li></ul><ul><li><lift:surround with=&quot;defa...
Scala vs. Java <ul><li>Code reduction </li></ul><ul><li>Java </li></ul><ul><li>DocumentBuilderFactory domFactory =   Docum...
Scala vs. Java <ul><li>Java </li></ul><ul><li>XPathExpression xe = xpath.compile  (&quot;//order/item&quot;); </li></ul><u...
Fazit <ul><li>Pros: </li></ul><ul><li>Viele Vorteile durch XML-Unterstützung auf syntaktischer Ebene </li></ul><ul><li>Ver...
Literatur & Links <ul><li>Scala XML (draft), Emir Burak http://burak.emir.googlepages.com/ scalaxbook.docbk.html  </li></u...
Vielen Dank <ul><li>Tobias Neumann </li></ul><ul><li>ITGAIN Consulting GmbH </li></ul><ul><li>[email_address] </li></ul><u...
Upcoming SlideShare
Loading in...5
×

Scala XML

3,166

Published on

Presentation (in German) about Scala XML given at W-JAX 2009 in Munich.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,166
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
23
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Scala XML"

  1. 1. Scala XML – Einfache XML Verarbeitung Tobias Neumann | ITGAIN Consulting
  2. 2. <ul><li>XML Literale, Embedded Expressions </li></ul>
  3. 3. XML Literale <ul><li>Scala hat direkte XML-Sprachunterstütung </li></ul><ul><li>XML Literale sind &quot;first-class&quot; val x = <itemNo>1234</itemNo> </li></ul><ul><li>Ergebnis ist vom Typ Elem val x = Elem(null,&quot;itemNo&quot;,null,TopScope, Text(1234)) </li></ul>
  4. 4. XML Element <ul><li>case class Elem ( val override prefix : java.lang.String, val label : java.lang.String, val override attributes : MetaData, val override scope : NamespaceBinding, val child : Node*) extends Node </li></ul>
  5. 5. Attribute <ul><li>Attribute im XML-Literal val order = <order prio=&quot;high&quot;></order> </li></ul><ul><li>Attribute sind eine verkettete Liste von (Un)prexfixedAttribute val attr=new UnprefixedAttribute(&quot;prio&quot;,&quot;high&quot;,Null) </li></ul><ul><li>Attribute in Elem Elem(null,&quot;order&quot;,attr,TopScope) </li></ul><ul><li>PrefixedAttribute für Namespaces </li></ul>
  6. 6. Namespaces <ul><li>Namespaces im XML-Literal val order = <o:order xmlns:o=&quot;http://company.com&quot;></o:order> </li></ul><ul><li>NamespaceBinding val scope=new NamespaceBinding(&quot;o&quot;,&quot;http://company.com&quot;, TopScope) </li></ul><ul><li>Namespace in Elem Elem(&quot;o&quot;,&quot;order&quot;,null,scope) </li></ul>
  7. 7. Übersicht XML Klassen <ul><li>Node: Superklasse aller XML-Nodes </li></ul><ul><li>NodeSeq: Sequence von Nodes, jede Node erbt von NodeSeq </li></ul><ul><li>Elem: Elemente werden dargestellt mit Elem und Text </li></ul><ul><li>Elem und Text sind Case Classes  Pattern Matching </li></ul>NodeSeq Node Elem
  8. 8. Embedded Expressions <ul><li>Scala Code ist innerhalb des XML Literals ausführbar: <quantity> { 3+5 } </quantity> val quantity = 24 <order prio= { if (quantity > 10) &quot;high&quot; else &quot;normal&quot; } > <itemNo>123</itemNo> <quantity> { quantity } </quantity> </order> </li></ul>
  9. 9. Embedded Expressions <ul><li>Wenn Ergebnis vom Typ Node oder NodeSeq ist, wird dieses direkt eingefügt </li></ul><ul><li>val l = (&quot;1414&quot;,&quot;5&quot;) :: (&quot;6262&quot;,&quot;3&quot;) :: (&quot;1212&quot;,&quot;1&quot;) :: Nil </li></ul><ul><li><order> </li></ul><ul><li>{ l.map(p => <item> </li></ul><ul><li><itemNo>{p._1}</itemNo> </li></ul><ul><li><quantity>{p._2}</quantity></item> ) } </li></ul><ul><li></order> </li></ul><ul><li> Beispiel 1 </li></ul>
  10. 10. Serialisierung <ul><li>Einfache Serialisierung mit Embedded Expressions </li></ul><ul><li>case class item(val itemNo, val quantity) </li></ul><ul><li>{ def toXML= { <item><itemno> { itemno } </itemNo> <quantity> { quantity } </quantity></item> } </li></ul><ul><li>} </li></ul><ul><li> Beispiel 2 </li></ul>
  11. 11. XML Laden und Speichern <ul><li>XML.load </li></ul><ul><ul><li>Lädt XML aus Reader, InputStream, etc. </li></ul></ul><ul><li>XML.loadFile </li></ul><ul><ul><li>Lädt XML direkt aus Datei </li></ul></ul><ul><li>XML.save </li></ul><ul><ul><li>Speichert XML in Datei </li></ul></ul><ul><li>XML.saveFull </li></ul><ul><ul><li>Speichert XML mit Angabe Encoding und Doctype </li></ul></ul>
  12. 12. <ul><li>Pattern matching </li></ul>
  13. 13. Pattern matching <ul><li>Pattern matching auf XML Literale </li></ul><ul><li>{} ist hier kein Ausdruck, sondern das Pattern </li></ul><ul><li>n match { </li></ul><ul><li>case <itemNo>{itemno}</itemNo> => println (&quot;Artikelnummer: &quot; + itemno) </li></ul><ul><li>case <quantity>{quantity}</quantity> => println (&quot;Anzahl: &quot; + quantity) </li></ul><ul><li>case _ => </li></ul><ul><li>} </li></ul><ul><li> Beipiel 3 </li></ul>
  14. 14. Pattern matching <ul><li>Alle Möglichkeiten des Pattern Matching </li></ul><ul><li>Binden von Variablen mit @ </li></ul><ul><li>Wildcards mit _ und _* </li></ul><ul><li>case <order>order @ _*</order> => order.foreach(printNode) </li></ul>
  15. 15. Update/Add Nodes <ul><li>Pattern matching kann gut genutzt werden für Updaten und Hinzufügen von Node </li></ul><ul><li>def addNode(n: Node, newNode: Node): Node = n match { </li></ul><ul><li>case <order>{oldNode @ _*}</order> => <order>{oldNode}{newNode}</order> </li></ul><ul><li>} </li></ul><ul><li> Beipiel 4 </li></ul>
  16. 16. XSLT-like Transformation <ul><li>Pattern matching bietet XSLT-ähnliche Transformation von XML </li></ul><ul><li>Definition eines Templates </li></ul><ul><li>case <order>{x @ _*}</order> => <html> <head><title>Bestellliste</title></head> <body>{transform(x)}</body> </html> </li></ul><ul><li>case <item>{x @ _*}</item> => <p>{transform(x)}</p> </li></ul><ul><li>case <itemNo>{x @ _*}</itemNo> => <b>Artikel {x}: </b> </li></ul><ul><li> Beispiel 5 </li></ul>
  17. 17. <ul><li>Xpath-like Queries </li></ul>
  18. 18. XPath-like Queries <ul><li>Die Methoden und bieten Xpath-ähnliche Abfragen auf Nodes </li></ul><ul><li>Ergebnis ist wieder vom Typ NodeSeq </li></ul>XPath Scala Direkt unterge- / ordneter Knoten /item &quot;item&quot; Untergeordneter // Knoten //quantity &quot;quantity&quot; Attribute @ @ //@prio &quot;@prio&quot;
  19. 19. Deserialisierung <ul><li>Deserisalisierung mit XPath: </li></ul><ul><li>def fromXML(n: Node): Item = { </li></ul><ul><li>new Item(n &quot;itemNo&quot; text, n &quot;quantity&quot; text) </li></ul><ul><li>} </li></ul><ul><li>val n = <item><itemNo>5</itemNo> <quantity>5</quantity><item> </li></ul><ul><li>val item = Item.fromXML(n) </li></ul><ul><li>item: Item = Item(3,5) </li></ul><ul><li> Beispiel 2a </li></ul>
  20. 20. Transformation <ul><li>Transformation mit XPath </li></ul><ul><li>def transformOrderlist(node: Node): Node = { def transform(ns: NodeSeq) : NodeSeq = for (n <- ns &quot;item&quot;) yield <p><b>Artikel { n &quot;itemNo&quot; text } : </b> { n &quot;quantity&quot; text } mal</p> {<html><head><title>Bestellliste</title></head> <body><h1>Bestellliste:</h1> { transform(node) } </body></html>} </li></ul><ul><li>} </li></ul><ul><li> Beispiel 6 </li></ul>
  21. 21. XML-Validierung <ul><li>XML.load() lädt immer die eingebundene DTD/XSD Datei </li></ul><ul><li>Offensichtlich wird aber nicht validiert! </li></ul><ul><li>Implementierung des ValidatingMarkupHandlers führt zu Fehlern beim Lesen der DTD </li></ul><ul><li>Work-around: Wrapping des SAX Parsers </li></ul>
  22. 22. Beispiel: Scala XML in Lift <ul><li>Verwendung von XML-Literalen in Lift: </li></ul><ul><li><lift:surround with=&quot;default&quot; at=&quot;content&quot;> <h2>Welcome to your project!</h2> <p> <lift:helloJax.hello /> </p> </li></ul><ul><li></lift:surround> </li></ul><ul><li>class HelloJax { def hello = <span>Welcome to JAX at {new _root_.java.util.Date}</span> </li></ul><ul><li>} </li></ul>
  23. 23. Scala vs. Java <ul><li>Code reduction </li></ul><ul><li>Java </li></ul><ul><li>DocumentBuilderFactory domFactory = DocumentBuilderFactory. newInstance(); </li></ul><ul><li>DocumentBuilder builder = domFactory.newDocumentBuilder(); </li></ul><ul><li>Document doc = builder.parse(&quot;order.xml&quot;); </li></ul><ul><li>Scala </li></ul><ul><li>val doc = XML.loadFile(&quot;order.xml&quot;); </li></ul>
  24. 24. Scala vs. Java <ul><li>Java </li></ul><ul><li>XPathExpression xe = xpath.compile (&quot;//order/item&quot;); </li></ul><ul><li>NodeList nodes = (NodeList) xe.evaluate(doc,XPathConstants. NODESET); </li></ul><ul><li>Scala </li></ul><ul><li>val nodes = doc &quot;order&quot; &quot;item&quot; </li></ul>
  25. 25. Fazit <ul><li>Pros: </li></ul><ul><li>Viele Vorteile durch XML-Unterstützung auf syntaktischer Ebene </li></ul><ul><li>Verschiedene Techniken </li></ul><ul><ul><li>Case classes/pattern matching </li></ul></ul><ul><ul><li>XPath </li></ul></ul><ul><li>Cons: </li></ul><ul><li>XML-Validierung </li></ul><ul><li>Dokumentation </li></ul>
  26. 26. Literatur & Links <ul><li>Scala XML (draft), Emir Burak http://burak.emir.googlepages.com/ scalaxbook.docbk.html </li></ul><ul><li>Programming in Scala, Martin Odersky et al </li></ul><ul><li>Why simple XML processing is so painful in Java?, Francois Armand http://fanf42.blogspot.com/2009/08/why-simple-xml-processing-is-so-painful.html </li></ul><ul><li>XSD Validation in Scala, Sean Wellington http://sean8223.blogspot.com/2009/09/xsd-validation-in-scala.html </li></ul>
  27. 27. Vielen Dank <ul><li>Tobias Neumann </li></ul><ul><li>ITGAIN Consulting GmbH </li></ul><ul><li>[email_address] </li></ul><ul><li>www.itgain.de </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×